为什么在使用`std :: find`时错误显示'operator =='不匹配?

时间:2019-04-28 05:35:09

标签: c++ algorithm c++11 stdvector stdstring

我正在使用std::find来检查字符串不在std::vector<std::vector<string>>

错误:

no match for 'operator==' (operand types are 'std::vector<std::__cxx11::basic_string<char> >' and 'const char [6]')

类型不匹配吗?

vector< vector< string>>data;

if(find(data.begin(), data.end(), "START") == data.end()){

    printf("Missing \"START\"\n");
    return true;`

2 个答案:

答案 0 :(得分:1)

是,不是。触发错误是因为您有一个“字符串矢量”,即一个维度太大。改为使用data定义std::vector<std::string>,它将起作用。

但是为什么错误提示缺少运算符?

使用std::find()时,通常将其实现为实际执行工作的宏或模板化函数,而不是库中某处的预编译运行时函数。这样可以使编译器根据参数的实际类型进行全面优化。

由于容器是一个类,它的实际作用是试图找到特殊的成员函数std::vector<std::vector<std::string>>::operator==(const char*)。它不是直接以这种方式实现的,通常不是模板,而是在此处并不重要。重要的事实是,找不到带有某种参数的operator==()的任何版本,该参数可以某种方式直接或通过转换接受传递的字符串。这样做的原因是您的向量包含向量,因此唯一有效的参数将是字符串的另一个向量。

答案 1 :(得分:1)

在另一个答案中已经很好地解释了错误消息的原因。我想提供解决问题的方法。

在尝试查找的时候,如果向量的向量中的任何std::string元素都与"START" 匹配,则可以使用标准算法 {{ 3}} std::any_of 组合,返回std::find(vec.cbegin(), vec.cend(), str) != vec.cend();其中vec是向量向量的每一行。 unary predicate

#include <algorithm>
#include <string>
#include <iostream>
#include <vector>

bool isFound(const std::vector<std::vector<std::string>>& data, const std::string &str)
{
    const auto found_in_vector = [&str](const std::vector<std::string> & vec)-> bool {
        return std::find(vec.cbegin(), vec.cend(), str) != vec.cend(); // if found
    };

    if (std::any_of(data.cbegin(), data.cend(), found_in_vector))
    {
        std::cout << "Found\n";
        return true;
    }

    std::cout << "Missing \""<< str << " \"\n";
    return false;
}
int main()
{
    std::vector<std::vector<std::string>> data;
    std::vector<std::string> test{ "START","test" }; 
    data.emplace_back(test);

    std::cout << std::boolalpha << isFound(data, std::string{ "START" } );
}