如何重载结构内“==”操作?(How to overload '==' operat

2019-10-19 23:57发布

我有我希望使用从载体中删除项目一个结构,我不知道该项目将出现什么指数,所以我按值删除。 这里是我的结构:

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

我可以用这个结构来删除字符串的值,但是当我试图像这样一个载体使用:

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

我得到一个编译错误说没有匹配的==操作符。

所以我知道我必须重载该运营商本身,而在看一些它的整个SO,不能真正发现我的情况相匹配的实现其他实施方式的,大多数其他版本在其结构中声明的变量,但是这是一个简单的布尔,看看是否当前字符匹配下划线。 我有种困惑,我应该怎么建立我的过载,以配合我的情况。

编辑 :有问题的载体是方式的矢量列。

Answer 1:

问题不在于一个缺失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())


Answer 2:

您使用std::remove -它不使用比较器作为第三个参数,只是值删除。 假设你的abc矢量是vector<char>使用

std::remove(abc.begin(), abc.end(), '_')


Answer 3:

您正在试图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());


文章来源: How to overload '==' operator within a struct?
标签: c++ struct