C ++向量 - 查找(“'operator =='不匹配”)

Posted

技术标签:

【中文标题】C ++向量 - 查找(“\'operator ==\'不匹配”)【英文标题】:C++ vector - find ("no match for 'operator =='")C ++向量 - 查找(“'operator =='不匹配”) 【发布时间】:2014-07-14 12:44:31 【问题描述】:

所以我对 C++ 还很陌生,所以我想遍历我拥有的多维向量,但我遇到了诸如

之类的错误

stl_algo.h

error: no match for 'operator==' (operand types are std::vector<std::basic_string<char> >' and 'const std::basic_string<char>'

有很多错误,代码如下:

mClass.h

std::vector<std::vector<std::string> > aData;

mClass.cpp

bool mClass::checkVector(std::string k)

    if (std::find(mClass::aData.begin(), mClass::aData.end(), k) != mClass::aData.end())
    
        return true;
    
    return false;

【问题讨论】:

感谢您提供包含错误消息和源代码的问题。错误消息说明了一切:您正在尝试比较向量和字符串。 你不能把std::vector&lt;std::string&gt;std::string比较 那么我将如何循环遍历它呢?我想这就是你的意思。谢谢你们的回复。编辑:这是我得到部分代码的地方:***.com/questions/571394/… 通过 const 引用传递字符串以提高性能。 【参考方案1】:

mClass::aData.begin()mClass.aData.end() 返回向量上的迭代器,而不是字符串上的迭代器。没有operator == 可以比较vectorstring。因此出现错误。

您需要遍历vectors。假设你有 C++11 支持:

bool mClass::checkVector(std::string const& k)

  for (auto const& vec : aData)  // Each `vec` is a std::vector<std::string>
    for (auto const& str : vec)  // Each `str` is a std::string
      // compare string represented by it2
      if (str == k) 
        return true;
      
    
  
  return false;

【讨论】:

三点说明: 命名 'it' 有点令人困惑,因为它不是一个迭代器。其次,这种情况下最好写for( auto&amp; it : aData )。没有 '&' 元素将被复制。最后,您应该提到这是一个 C++11 解决方案。 这是有道理的。非常感谢。 :-) 如果可以的话,我会接受作为答案。 @thelamb - 是的,你在这两个方面都是正确的。在使用容器时,使用it 对我来说是一个很难改掉的习惯。 为此我遇到了一些错误。 'auto' changes meaning in C++11; please remove it, invalid declaratator before ':' token, range-based 'for' loops are not allowed in C++98 mode 正如 cmets 中所指出的,此解决方案需要 C++11。如果需要为mingw启用C++11,可以访问this页面看看是否适用。否则,您可以使用任何其他不需要 C++11 的答案。【参考方案2】:

(c++11 之前的)解决方案是先遍历向量:

为方便起见,请注意 typedef。

typedef std::vector<std::vector<std::string> > vvec;
bool mClass::checkVector(std::string k)

    for(vvec::const_iterator it=mClass::aData.begin(), end=mClass::aData.end();it!=end;++it)
        const std::vector<std::string>& inner=*it;
        if (std::find(inner.begin(), inner.end(), k) != inner.end())
        
            return true;
        
    
    return false;

【讨论】:

明白。感谢您的回复。【参考方案3】:

因为你有一个多维数组,所以你不能使用迭代器来遍历每个值,所以最好的方法是先创建一个循环

for(std::vector<std::vector<std::string> >::iterator it = Class::aData.begin(); it!=mClass::aData.end(); ++it)
    if (std::find(it->begin(), it->end(), k) != it->end())
    
        return true;
    
return false;

您只能在最低级别的迭代器上使用std::find,而不能在完整向量的迭代器上使用。

【讨论】:

以上是关于C ++向量 - 查找(“'operator =='不匹配”)的主要内容,如果未能解决你的问题,请参考以下文章

在字符向量列表中查找任何交集

C ++有效查找向量中第一个最近的匹配值?

C ++在字符串向量中查找字符串的频率

向量上的 C++ operator() 优化

查找三个坐标系之间的旋转和平移

R-查找值的唯一排列