为什么在使用 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()
时,它通常作为执行实际工作的宏或模板函数实现,而不是库中某处的预编译运行时函数。这允许编译器根据您的参数的实际类型进行全面优化。
它实际上做了什么 - 因为你的容器是一个 class - 试图找到一个特殊的成员函数,std::vector<std::vector<std::string>>::operator==(const char*)
。它不是直接以这种方式实现的,通常是一个模板,但这在这里并不重要。重要的事实是它不会找到任何版本的 operator==()
其参数能够以某种方式直接或通过转换接受传递的字符串。这样做的原因是您的向量包含向量,因此唯一有效的参数是另一个字符串向量。
错误信息的原因在另一个答案中已经很好地解释了。我想提供一个解决问题的方法。
正如您要查找的那样,如果 vector 向量中的任何 std::string
元素与 "START"
匹配,您可以使用标准算法std::any_of in combination with a unary predicate which returns std::find(vec.cbegin(), vec.cend(), str) != vec.cend()
; where vec
is the each rows of the vector of vectors. See a demo here
#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" } );
}
我正在使用 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()
时,它通常作为执行实际工作的宏或模板函数实现,而不是库中某处的预编译运行时函数。这允许编译器根据您的参数的实际类型进行全面优化。
它实际上做了什么 - 因为你的容器是一个 class - 试图找到一个特殊的成员函数,std::vector<std::vector<std::string>>::operator==(const char*)
。它不是直接以这种方式实现的,通常是一个模板,但这在这里并不重要。重要的事实是它不会找到任何版本的 operator==()
其参数能够以某种方式直接或通过转换接受传递的字符串。这样做的原因是您的向量包含向量,因此唯一有效的参数是另一个字符串向量。
错误信息的原因在另一个答案中已经很好地解释了。我想提供一个解决问题的方法。
正如您要查找的那样,如果 vector 向量中的任何 std::string
元素与 "START"
匹配,您可以使用标准算法std::any_of in combination with a unary predicate which returns std::find(vec.cbegin(), vec.cend(), str) != vec.cend()
; where vec
is the each rows of the vector of vectors. See a demo here
#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" } );
}