Форум программистов, компьютерный форум CyberForum.ru

Поиск в STL - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
{alex}
0 / 0 / 0
Регистрация: 05.02.2011
Сообщений: 19
23.04.2011, 18:37     Поиск в STL #1
Здравствуйте) Вот пытаюсь совершить поиск в контейнере вектор спомощью find. Написал функтор, ищу ну что-то наверное неправильно. Не подскажите в чём загвоздка. Заранее благодарен. Вот код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct CompareName{
    bool operator()(PRODUCT &n1,string t)
 {
     return n1.get_str()==t;
 }
}StrName;
vector<PRODUCT> vr;
 vector<PRODUCT>::iterator it;
    it=find(vr.begin(),vr.end(), CompareName(StrName) );
        if(it==vr.end())
            cout<<"The string was not found";
        else
            cout<<"found: "<<*it;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
23.04.2011, 19:20     Поиск в STL #2
Стандартный алгоритм std::find работает посредством оператора ==, для того, чтобы пользоваться функторами, придется написать свой find, например, так:

C++
1
2
3
4
5
6
7
8
template <typename _Iter, typename _Ty, typename _Comp>
_Iter my_find(_Iter _first, _Iter _last, _Ty _val, _Comp  _fn)
    {
    for(; _first != _last; ++_first)
        if(_fn(*_first,_val))
            break;
    return _first;
    }
Видимо, предполагается сравнивать с std::string, так что вызов my_find можно сделать так:
C++
1
it=my_find(vr.begin(),vr.end(), "Hey!", StrName);
или так
C++
1
it=my_find(vr.begin(),vr.end(), "Hey!", CompareName());
Добавлено через 5 минут
Всё это применительно к тому, если нужно пользоваться бинарными предикатами, если нужно просто найти элементы, удовлетворяющие какому-то условию, то подойдет std::find_if.
{alex}
0 / 0 / 0
Регистрация: 05.02.2011
Сообщений: 19
23.04.2011, 19:36  [ТС]     Поиск в STL #3
Спасибо, сейчас попробую

Добавлено через 9 минут
Со своим find помогло, а вот find_if тоже не пашет. Ну если я правильно понимаю то стандартные типы можно искать этими методами, а вот для пользовательского типа надо писать свои какие-то функции, перегруженные операторы и тому подобное.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.04.2011, 19:42     Поиск в STL #4
Добавлено через 2 минуты
{alex}, Для find_if...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct CompareName{
 CompareName(const string& other):t(other)
 {
 }
 bool operator()(PRODUCT &n1)
 {
         return n1.get_str()==t;
 }
 const string t;
}
 
int main()
{
string str;
std::getline(std::cin, str);
vector<PRODUCT> vr;
 vector<PRODUCT>::iterator it;
        it=find_if(vr.begin(),vr.end(), CompareName(str) );
                if(it==vr.end())
                        cout<<"The string was not found";
                else
                        cout<<"found: "<<*it;
}
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
23.04.2011, 19:44     Поиск в STL #5
Просто каждый алгоритм предназначен для одной цели, полностью универсальных нет. Естественно, если вы работаете со своими типами и используете STL, то стоит позаботиться о том, чтобы были определены соответствующие операции сравнения и прочее, "из коробки" работать не будет, предоставите алгоритмам то, чего они хотят - они будут работать.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.04.2011, 13:34     Поиск в STL #6
функция STL - find, прекрасно может справиться с любым пользовательским типом, для этого в С++ есть мощная методика в перегрузки операторов, добавьте несколько строк кода для сравнения в свою структуры и всё, вот наглядный пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
struct   man {
    char   name[32];
    int      age;
    man(void) {}
    man(const char* hName, const int hAge) {
    strcpy(name, hName);
    age = hAge;
    }
    // перегрузка для строки
    bool operator == (const char*  hStr) const {
    return  (! strcmp(name, hStr));
    }
    // перегрузка для числа
    bool  operator == (int hAge) const {
    return (age == hAge);
    }
    // перегрузка для всей структуры
    bool  operator == (const man  hMan) const {
          return (! memcmp((const void*)this, (const void*)&hMan, sizeof(man)) );
    }
};
 
 
 
void  main(){
    vector<man>  v;
    v.push_back( man("Alex", 27 ));
    v.push_back( man("Stas", 25 ));
    v.push_back( man("Katy", 24 ));
    v.push_back( man("Oly", 20 ));
    v.push_back( man("Pavel",30 ));
 
   // поиск по-всей структуре
   vector<man>::iterator  iter1 = find( v.begin(), v.end(),  man("Katy", 24));
   if( iter1 != v.end() ) 
        printf("Name = %s,  age = %d\n", iter1->name, iter1->age);
    
   // поиск по-строке в структуре
   vector<man>::iterator  iter2 = find( v.begin(), v.end(),  "Oly");
   if(iter2 != v.end() )
    printf("Name = %s,  age = %d\n", iter2->name, iter2->age);
 
   // поиск по-числу в структуре
  vector<man>::iterator  iter3 = find( v.begin(), v.end(),  25);
  if(iter3 != v.end() )
       printf("Name = %s,  age = %d\n", iter3->name, iter3->age);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2011, 13:44     Поиск в STL
Еще ссылки по теме:

Multimap STL - работает только запись в файл, поиск в файле не работает C++
Поиск и сортировка list STL C++
List STL сортировка и поиск C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.04.2011, 13:44     Поиск в STL #7
xAtom, Предикаты помощнее будут, ага
Yandex
Объявления
24.04.2011, 13:44     Поиск в STL
Ответ Создать тему
Опции темы

Текущее время: 19:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru