我有我希望使用从载体中删除项目一个结构,我不知道该项目将出现什么指数,所以我按值删除。 这里是我的结构:
struct IsUnderScore{
bool operator()(char c){
return c=='_';
}
};
我可以用这个结构来删除字符串的值,但是当我试图像这样一个载体使用:
abc.erase(std::remove(abc.begin(), abc.end(), IsUnderScore()), abc.end());
我得到一个编译错误说没有匹配的==操作符。
所以我知道我必须重载该运营商本身,而在看一些它的整个SO,不能真正发现我的情况相匹配的实现其他实施方式的,大多数其他版本在其结构中声明的变量,但是这是一个简单的布尔,看看是否当前字符匹配下划线。 我有种困惑,我应该怎么建立我的过载,以配合我的情况。
编辑 :有问题的载体是方式的矢量列。
问题不在于一个缺失operator==
,而是使用了错误的功能+参数对。 remove()
需要一个项作为第三参数,而不是一个谓词。 对于一个谓语,你需要remove_if
。 所以,执行下列操作之一:
std::remove(abc.begin(), abc.end(), '_')
// or
std::remove_if(abc.begin(), abc.end(), IsUnderScore())
编辑
的第三个参数remove
是迭代器的值类型的类型。 中使用的谓词的参数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())
您使用std::remove
-它不使用比较器作为第三个参数,只是值删除。 假设你的abc
矢量是vector<char>
使用
std::remove(abc.begin(), abc.end(), '_')
您正在试图remove
替代remove_if
。 (或者你正在试图remove
一个函子,而不是一个字符)。
最好的和简单的解决方案:
abc.erase(std::remove(abc.begin(), abc.end(), '_'), abc.end());
另一种方法(没有太大的用处在这里,但为了以防万一,你需要一个更复杂的比较来确定要删除哪些元素):
abc.erase_if(std::remove_if(abc.begin(), abc.end(), IsUnderScore()), abc.end());