繁体   English   中英

为什么在使用 `std::find` 时错误与“operator==”不匹配?

[英]Why the error no match for 'operator==', when using `std::find`?

我正在使用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;`

是和否。 错误被触发,因为你有一个“字符串向量的向量”,即有一维太多了。 使用std::vector<std::string>定义data ,它会起作用。

但是为什么错误会提到缺少操作符呢?

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

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

错误消息的原因已在另一个答案中得到很好的解释。 我想为这个问题提供一个解决方案。

当你正在努力寻找,如果有任何的std::string矢量火柴的矢量元素"START" ,你可以使用标准算法的std :: any_of结合一元谓词返回std::find(vec.cbegin(), vec.cend(), str) != vec.cend() ; 其中vec是向量向量的每一行。 在此处查看演示

#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" } );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM