【问题标题】:Trying to use find_if function to locate value in vector of pairs by first element尝试使用 find_if 函数按第一个元素定位对向量中的值
【发布时间】:2019-09-26 18:58:34
【问题描述】:

拥有一段代码来扫描大字符串 (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));
    ...

得到编译错误:

在 C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/stl_algobase.h:71:0 包含的文件中, 来自 C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/char_traits.h:39, 来自 C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/ios:40, 来自 C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/ostream:38, 来自 C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/iostream:39, 来自 webCounter.cpp:19: C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/predefined_ops.h: 在实例化'bool __gnu_cxx::__ops::_Iter_pred::operator()(_Iterator) [ with _Iterator = __gnu_cxx::__normal_iterator, int>*, std::vector, int> > >; _谓词 = std::__cxx11::basic_string]': C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/stl_algo.h:120:14: '_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std: :random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator, int>*, std::vector, int> > >; _谓词 = __gnu_cxx::__ops::_Iter_pred >]' C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/stl_algo.h:161:23: '_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = __gnu_cxx::__normal_iterator, int>*, std::vector, int> > >; _谓词 = __gnu_cxx::__ops::_Iter_pred >]' C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/stl_algo.h:3815:28: '_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator, int>*, std::vector, int> > >; _谓词 = std::__cxx11::basic_string]' webCounter.cpp:68:58: 从这里需要 C:/TDM-GCC-32/lib/gcc/mingw32/5.1.0/include/c++/bits/predefined_ops.h:234:30: 错误:不匹配调用'(std::__cxx11::basic_string) (std::pair, int>&)' { return bool(_M_pred(*__it)); }

【问题讨论】:

    标签: c++ c++11 gcc vector


    【解决方案1】:

    问题是pair &lt;string,int&gt; 和看似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
                  });
    

    Documentation for Lambda Expressions

    也就是说,

    std::map<string, int> freqmap;
    

    如果允许,可能是此任务的更好选择。几乎所有代码都简化为

    freqmap[currentword]++;
    

    Documentation for std::map

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多