【问题标题】:Erase object from vector in C++从 C++ 中的向量中擦除对象
【发布时间】:2016-03-23 08:17:11
【问题描述】:

我试图从 C++ 中的向量中删除一个对象,但它给出了一个奇怪的(而且很长的)错误。我写了这个:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class foo
{
    int a;
    public:
    foo(int _a):a(_a){}
};

int main() {
    foo f1(5),f2(10);
    vector<foo> vec = {f1,f2};
    vec.erase(remove(vec.begin(),vec.end(),f1),vec.end()); // remove f1 (error)
    return 0;
}

我得到的确切错误是here
另一方面,当我创建一个 int 向量,然后尝试从该向量中删除一个整数时,它工作正常。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> vec = {5,10};
    vec.erase(remove(vec.begin(),vec.end(),5),vec.end()); // works fine
    return 0;
}

我不确定为什么在第一种情况下会出错。

【问题讨论】:

  • 发布确切的错误信息
  • 没有foo::operator ==
  • 我猜您会收到错误消息,因为您没有为 foo 类定义比较运算符。否则编译器将如何知道如何比较 foo 类的实例?
  • @MohitJain 我现在发布了一个显示错误的 ideone 链接。谢谢
  • 错误信息告诉你,确切地,出了什么问题。阅读它们,对您了解它们发生的原因有很大帮助。

标签: c++ vector stl


【解决方案1】:

对于std::remove,您的class foo 应该包含operator ==,或者您应该显式传递一个比较函数。对于标准类型(例如int),比较函数是由语言定义的,因此编译不会出错。

operator == 的一个例子可以是:

class foo
{
    ...
    bool operator ==(const foo &t) const { return t.a == a; }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多