我有一个结构,我希望用它来从矢量中删除项目,我不知道该项目将出现在哪个索引,所以我按值删除它。这是我的结构:
struct IsUnderScore{
bool operator()(char c){
return c=='_';
}
};
我可以使用这个结构从字符串中删除值,但是当我尝试在这样的向量上使用时:
abc.erase(std::remove(abc.begin(), abc.end(), IsUnderScore()), abc.end());
我收到一个编译错误,指出==运算符没有匹配。
所以我知道我必须重载这个运算符本身,并且在整个SO中查看它的一些其他实现时,实际上找不到与我的情况相匹配的实现,大多数其他版本都在其中声明了变量结构但这是一个简单的bool来查看当前字符是否与下划线匹配。我有点困惑,因为我应该如何构建我的超载来匹配我的情况。
编辑:顺便提一下,有问题的矢量是一个矢量字符串。
答案 0 :(得分:2)
您使用std::remove
- 它不使用比较器作为第三个参数,而只使用要删除的值。假设您的abc
向量为vector<char>
,请使用
std::remove(abc.begin(), abc.end(), '_')
答案 1 :(得分:2)
问题不在于缺少operator==
,而是使用了错误的函数+参数对。 remove()
将项作为第三个参数,而不是谓词。对于谓词,您需要remove_if
。所以做其中一个:
std::remove(abc.begin(), abc.end(), '_')
// or
std::remove_if(abc.begin(), abc.end(), IsUnderScore())
修改强>
remove
的第3个参数是迭代器值类型的类型。 remove_if
中使用的谓词的参数采用相同的类型。根据您的修改,在您的情况下,这是std::string
,因此您必须相应地使用它。使用remove
和字符串:
std::remove(abc.begin(), abc.end(), "_")
// or
std::remove(abc.begin(), abc.end(), std::string("_"))
或更新谓词以用于remove_if
:
struct IsUnderScore{
bool operator()(const std::string &s){
return s == "_";
}
};
// ...
std::remove_if(abc.begin(), abc.end(), IsUnderScore())
答案 2 :(得分:0)
您正在尝试remove
而不是remove_if
。 (或者您正在使用仿函数尝试remove
,而不是char)。
最好和最简单的解决方案:
abc.erase(std::remove(abc.begin(), abc.end(), '_'), abc.end());
替代方案(这里不太有用,但是如果您需要更复杂的比较来确定要删除的元素):
abc.erase_if(std::remove_if(abc.begin(), abc.end(), IsUnderScore()), abc.end());