Попытка использовать функцию find_if для поиска значения в векторе пар по первому элементу - PullRequest
2 голосов
/ 09 мая 2019

Есть кусок кода для сканирования большой строки (HTML), а затем проанализировать любые слова из нее. Переместите все экземпляры в вектор или пары (слово и число), если его там еще нет, в противном случае увеличьте счетчик (второй элемент пары).

vector < pair <string,int> > vect; 
vector < pair <string,int> >::iterator it;

    ...

it = find_if (vect.begin(), vect.end(), currentword);
if (it != vect.end())
        it->second++;
else 
    vect.push_back( make_pair(currentword, 1));
    ...

Получение ошибки компиляции:

In file included from C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/stl_algobase.h:71:0,
                 from C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/char_traits.h:39,
                 from C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/ios:40,
                 from C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/ostream:38,
                 from C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/iostream:39,
                 from webCounter.cpp:19:
C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/predefined_ops.h: In instantiation of 'bool __gnu_cxx::__ops::_Iter_pred::operator()(_Iterator) [with _Iterator = __gnu_cxx::__normal_iterator, int>*, std::vector, int> > >; _Predicate = std::__cxx11::basic_string]':
C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/stl_algo.h:120:14:   required from '_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator, int>*, std::vector, int> > >; _Predicate = __gnu_cxx::__ops::_Iter_pred >]'
C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/stl_algo.h:161:23:   required from '_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = __gnu_cxx::__normal_iterator, int>*, std::vector, int> > >; _Predicate = __gnu_cxx::__ops::_Iter_pred >]'
C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/stl_algo.h:3815:28:   required from '_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator, int>*, std::vector, int> > >; _Predicate = std::__cxx11::basic_string]'
webCounter.cpp:68:58:   required from here
C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/predefined_ops.h:234:30: error: no match for call to '(std::__cxx11::basic_string) (std::pair, int>&)'
  { return bool(_M_pred(*__it)); }

1 Ответ

4 голосов
/ 09 мая 2019

Проблема в том, что нет встроенного сравнения между pair <string,int> и тем, что выглядит как string.Вы должны будете предоставить один.Например,

it = find_if (vect.begin(), 
              vect.end(), 
              [currentword](const pair <string,int>& p){ // this is a lambda expression
                  return p.first == currentword; // compare strings
              });

Документация для лямбда-выражений

При этом

std::map<string, int> freqmap;

может быть лучшим выбором для этой задачи, еслипозволил.Почти весь код сокращается до

freqmap[currentword]++;

Документация для std::map

...