c++ - 为什么 std::vector 需要 operator =

标签 c++ stl

我有一个关于我们可以存储在 vector 中的类的问题。 可以存储在 vector 中的要求是什么? 似乎这样的类必须有赋值运算符。但我不确定是否仅此而已。

让我举个例子。 A 类有 const int 成员。如果我不写 operator =,它就不会编译。但是在这个例子中,这个操作符什么都不做。该程序正确显示 10 和 20。看起来 operator = 是必需的,但实际上并没有使用。

#include <iostream>
#include <vector>

class A {
 public:
  A(int a) : a_(a) {}
  A& operator =(const A& a2) { return *this;} // Without this, compile fails.
  void print() const {
    std::cerr << a_ << std::endl;
  }
 private:
  const int a_;
};

int main(int argc, char** argv) {
  std::vector<A> v;
  v.push_back(A(10));
  v.push_back(A(20));
  for (const A& a : v) a.print();
}

最佳答案

这可能会让您大吃一惊:

v.push_back(A(20));
v.push_back(A(10));
std::sort(begin(v), end(v));

vector 本身的某些方面需要可分配性,虽然我不知道,但我无法通过编译你的代码来判断,因为当我删除 operator= 时我的编译器不会提示())。根据Wikipedia (引用了 '03 标准的相关部分),元素必须是 CopyConstructibleAssignable

编辑: 一天后回到这个问题上,当 std::vector 需要 Assignable 时,这似乎非常明显——任何时候它必须四处移动元素。例如,添加对 v.insert()v.erase() 的调用,编译将失败。

关于c++ - 为什么 std::vector 需要 operator =,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17760580/

相关文章:

c++ - 如何在 C++ 中测试 vector 初始化成功/失败

C++ 仿函数输出迭代器适配器

c++ - 如何从麦克风捕获音频以通过 socket 发送?

c++ - atomic_load/atomic_store on std::shared_ptr in VC11 - 为什么全局自旋锁?

c++ - 如何使用 fstream fstream::app 标志附加到文件似乎不起作用

c++ - 在 std::multiset 中,如果找到一个元素,是否有一种函数或算法可以只删除一个样本(单一或重复)

c++ - 如何使用 map 从 CPP 中带有 vector 的文件中获取唯一值?

c++ - 使用 new 放置移动构造对象

c++ - 'unbounded_buffer' 中的消息数

vector 的 C++ 初始化