如何在结构中重载'=='运算符?

时间:2014-04-25 13:19:22

标签: c++ struct

我有一个结构,我希望用它来从矢量中删除项目,我不知道该项目将出现在哪个索引,所以我按值删除它。这是我的结构:

struct IsUnderScore{
bool operator()(char c){
    return c=='_';
}
};

我可以使用这个结构从字符串中删除值,但是当我尝试在这样的向量上使用时:

abc.erase(std::remove(abc.begin(), abc.end(), IsUnderScore()), abc.end());

我收到一个编译错误,指出==运算符没有匹配。

所以我知道我必须重载这个运算符本身,并且在整个SO中查看它的一些其他实现时,实际上找不到与我的情况相匹配的实现,大多数其他版本都在其中声明了变量结构但这是一个简单的bool来查看当前字符是否与下划线匹配。我有点困惑,因为我应该如何构建我的超载来匹配我的情况。

编辑:顺便提一下,有问题的矢量是一个矢量字符串。

3 个答案:

答案 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());