【问题标题】:Does vector erase method needs class to have = operator?矢量擦除方法是否需要类具有 = 运算符?
【发布时间】:2020-05-15 01:27:13
【问题描述】:

我正在做一个计算机科学项目,我使用 stl 库向量作为向量(表是我实现的一个类)。当我尝试使用擦除方法而没有在我的类表中实现 operator= 时,它失败了。然后我添加了 = 现在它可以工作了,但我不确定这是问题所在。是否必须在类中有 operator= 才能使用擦除方法? 这是一个示例代码:

vector<Table> tables;
Table t("1");
Table t2("2");

tables.push_back(t);
tables.push_back(t2);

tables.erase(tables.begin());//If no operator = is defined this gives problems

【问题讨论】:

  • 从向量的前面或中间移除一个元素会移动内存中的剩余元素,因此它们必须是MoveAssignable,这需要一个可以绑定到右值的复制赋值或移动赋值运算符.
  • @cigien 我更新了我的评论

标签: c++ c++11 vector stl


【解决方案1】:

类中必须要有operator=才能使用erase方法吗?

是的,这是标准要求的。

为什么它在没有定义的情况下运行?

默认情况下,一个类具有编译器生成的隐式赋值运算符,但在某些情况下除外(例如,如果它具有不可赋值的子对象)。

【讨论】:

  • 为什么它在没有定义的情况下运行?
  • 如果你的类是simple,编译器会为你提供。
【解决方案2】:

考虑在您的代码中发生了什么。向量中有两个Tables,然后删除第一个。完成后,您有一个Table,它位于第一个“曾经”的内存位置

为此,向量需要将第二个向量复制/移动到第一个向量所在的位置。它通过赋值来做到这一点。

【讨论】:

    猜你喜欢
    • 2020-04-09
    • 2013-05-01
    • 2017-02-21
    • 2011-11-27
    • 2021-12-02
    • 2021-04-04
    • 2013-02-06
    • 1970-01-01
    • 2010-11-16
    相关资源
    最近更新 更多