найти () проблемы - PullRequest
2 голосов
/ 18 июля 2009

У меня ошибка при использовании функции find (). Вот код:

#include <iostream>
#include <map>

#define N 100000

using namespace std;

int main (int argc, char * const argv[]) {

    map<int,int> m;

    for (int i=0; i<N; i++) m[i]=i;

    find(m.begin(), m.end(), 5);

    return 0;
}

Я получаю сообщение об ошибке компилятора:

error: no match for 'operator==' in '__first. __gnu_debug::_Safe_iterator<_Iterator, _Sequence>::operator* [with _Iterator = std::_Rb_tree_iterator<std::pair<const int, int> >, _Sequence = __gnu_debug_def::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >]() == __val'

Включая «алгоритм» ничего не меняется. Компиляция в VS2008 показывает похожую ошибку.

Я знаю о m.find (), но мне действительно нужно использовать find ().

Большое спасибо за вашу помощь!

P.S. На самом деле задача состоит в том, чтобы сравнить скорость m.find (5) и найти (m.begin (), m.end (), 5), поэтому мне нужно, чтобы они оба работали правильно.

Ответы [ 3 ]

8 голосов
/ 18 июля 2009

begin() и end() во всех контейнерах STL обеспечивают доступ к элементам этих коллекций. Тип этих элементов известен как value_type контейнера. Для std::map<Key, Value> его value_type равно std::pair<Key, Value>. Поэтому ваша функция find пытается найти pair<int, int>, равное 5. Поскольку не определено operator== для сравнения pair<int, int> и int, вы получите ошибку.

Правильный способ сделать это (если вы хотите избежать члена find()) - это использовать std::find_if:

template <class First>
struct first_equal
{
   const First value;

   first_equal(const First& value)
        : value(value)
   {
   }

   template <class Second>
   bool operator() (const std::pair<First, Second>& pair) const
   {
        return pair.first == value;
   }
};

...

find_if(m.begin(), m.end(), first_equal<int>(5));

Вы также можете перегрузить operator== для pair и int, чтобы делать то, что вы хотите, но это очень хакерский способ (потому что это повлияет на весь ваш код и потому что такое сравнение не имеет смысла в общем) .

3 голосов
/ 18 июля 2009

find () требует параметра, который можно сравнить с * итератором. Для вашей карты это будет пара . Вам нужно будет создать фиктивную пару плюс функтор сравнения для сравнения пар.

2 голосов
/ 18 июля 2009

Просто используйте m.find (5)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...