Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в массиве STL, помогите дописать код 
:(
    Опции темы
Annuta
Дата 26.12.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



Народ подскажите мне пожаста, у меня есть массив строк типа CStringArray ... когда в этом массиве более 1000 строчек - прога начинает тормозить... я слышала что использование STL может разрешить эту проблему ! Это так ???
 Но я в STL ни бум бум!!! Как это сделать...??? 
 Помогите мне переписать кусочек кода... вот мой нынешний код. 
   
Код

//***** Проверяем  наличие  строки  в  массиве  ******//
    for(k = 0; count > k; k++)
   {
    if (mas_str == String_arr.ElementAt(k))
        {
            j=1;
        }
   }
//**********************************************//    

  спасибо...
--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
zkv
Дата 26.12.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



копайте в сторону hash-таблиц, либо map'ов, многое обсуждалось, посмотрите здесь, например: Самый эффективный алгоритм поиска 
PM MAIL   Вверх
ZC1989
Дата 26.12.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



если простой пример на STL то получится как-то так
Код

#include <vector>

std::vector <CString>     String_arr;
std::vector <CString>     ::iterator iString_arr;

// Перебор зллементов
for(iString_arr = String_arr.begin(); iString_arr != String_arr.end(); ++iString_arr)
{

  // Твоё условие
  if (mas_str == *iString_arr)
  {
    j=1;
  }
}


Добавлено @ 11:54 
список будет перебираться пока все эллменты не проверятся...

ЗЫ: надеюсь прельна вопрос понял smile 

Это сообщение отредактировал(а) ZC1989 - 26.12.2006, 11:55


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
chaos
Дата 26.12.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Код

#include <algorithm>
#include <vector>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    vector<string> cntWords;
    cntWords.push_back("hello");
    cntWords.push_back("baby");
    cntWords.push_back("boy");
    cntWords.push_back("world");
    cntWords.push_back("c++");
    cntWords.push_back("pascal");

    vector<string>::iterator it = find(cntWords.begin(), cntWords.end(), "world");
    cout << *it << endl;
    return 0;
}

PM WWW   Вверх
Annuta
Дата 26.12.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



Спасибо за код 
ZC1989,  всё работает... только вот маленький вопросик.. а как мне добавить строчку в этот массивчик...??
  и ещё.. это на самом деле работает быстрее чем обычный перебор ???  Что круче вектора или мапсы..???
спасибо...

Это сообщение отредактировал(а) Annuta - 26.12.2006, 12:14
--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
zkv
Дата 26.12.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(ZC1989 @  26.12.2006,  11:53 Найти цитируемый пост)
ЗЫ: надеюсь прельна вопрос понял smile 

скорее всего нет, в вашем примере не видно существенного выигрыша по скорости поиска, а вопрос видимо был именно в этом.
простой пример с map'ом, возможно следует сделать все по другому, но я не знаю какая ваша конечная цель, возможны опечатки smile
Код

#include<map>

typedef std::map< std::string, int> MAP_STR_INT;

MAP_STR_INT mapStrInt;

//заполняем 
mapStrInt[ "first"] = 1;
mapStrInt[ "second"] = 2;
mapStrInt[ "third"] = 3;
//...
//***** Проверяем  наличие  строки  в  массиве  ******//
MAP_STR_INT::iterator itStrInt = mapStrInt.find( mas_str ) ;
if( itStrInt != mapStrInt.end() )
  {
   
            j= itStrInt->second;
        
   }

PM MAIL   Вверх
Annuta
Дата 26.12.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



Цитата(zkv @  26.12.2006,  12:13 Найти цитируемый пост)
 я не знаю какая ваша конечная цель

Моя конечная цель сделать так, чтобы это перебиралось как можно быстрее... и не вешало всю мою прогу.

--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
ZC1989
Дата 26.12.2006, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



zkv, было сказано что после 1000 строк тормоза начинаются, сомневаюсь что в моём примере это начнётся... да и find работает так же, только в функцию это засунуто

Это сообщение отредактировал(а) ZC1989 - 26.12.2006, 12:18


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
zkv
Дата 26.12.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(ZC1989 @  26.12.2006,  12:17 Найти цитируемый пост)
zkv, было сказано что после 1000 строк тормоза начинаются, сомневаюсь что в моём примере это начнётся... да и find работает так же, только в функцию это засунуто

не буду спорить, потому как не помню в чем точно дело, но не так же. Поправьте меня меня пожалуйста если я ошибаюсь smile
PM MAIL   Вверх
Annuta
Дата 26.12.2006, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



ZC1989, как добавить строку в массив ??? У меня задача .. перебрать весь массив - если такая строка не встретилась - добавить её туда... Как ? 
--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
Annuta
Дата 26.12.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



Народ!!! Помогите дописать добалвение !... плиз... 
--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
zkv
Дата 26.12.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Annuta @  26.12.2006,  12:59 Найти цитируемый пост)
Народ!!! Помогите дописать добалвение !... плиз...  

внимательней надо быть  smile 
для вектора:
Цитата(chaos @  26.12.2006,  12:12 Найти цитируемый пост)
 cntWords.push_back("baby");

для словаря:
Цитата(zkv @  26.12.2006,  12:13 Найти цитируемый пост)
mapStrInt[ "third"] = 3;


я догадываюсь, что вам наиболее подошел бы контейнер std::set<std::string>, там добавление insert(), если я не ошибаюсь, что вообще надо сделать то? 
PM MAIL   Вверх
Annuta
Дата 26.12.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



Сделать надо вот что... идёт поток... в потоке много строчек.. я выбираю все "уникальные" .. заношу их в массив .. (если их там ещё нет соотв) ... и сё... потом массив вывожу на экран.
.. я пробывала сделать.. так 
 
Код

typedef map<int, string, less<int> > INT2STRING;
        INT2STRING theMap;
        INT2STRING::iterator theIterator;
        string theString = "";
        int index;


и потом поиск совпадения...
Код

for (index = 0; index < (signed)theString.length(); index++)
                            {
                                if (theIterator == theMap.end() )
                                    j=1;
                    
                            }

и потом пытаюсь вставить  но он ругается...
Код

theMap.insert(INT2STRING::value_type(9,"Nine")); //Если так то не ругается....
theMap.insert(INT2STRING::value_type(x , mas_str)); //Если так Т О  ругается....

как написать чтобы он добавлял новую строку в конец списка... 
--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
zkv
Дата 26.12.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



ваша задача решается так:
Код

#include<set>
#include<string>
#include<iostream>

using namespace std;

int main()
{
    set< string > strSet;
    strSet.insert( "first" );
    strSet.insert( "second" );
    strSet.insert( "first" );
    strSet.insert( "third" );
    strSet.insert( "second" );
    //...
    for( set< string >::iterator itStr = strSet.begin(); itStr != strSet.end(); ++itStr)
        cout<<*itStr;
    cin.get();
}

если я правильно понял задание smile
PM MAIL   Вверх
Korman
Дата 26.12.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 12.9.2006
Где: г. Смоленск

Репутация: нет
Всего: нет



Спасибо... 
zkv, .. я ща попробую..
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0898 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.