【问题标题】:Does resizing an outer vector copies the inner vector?调整外部向量的大小是否会复制内部向量?
【发布时间】:2013-12-20 05:33:55
【问题描述】:

假设你有一个向量的向量:

vector<vector<string> > v;

当外部向量的内部数组被调整大小时(假设内部数组也必须重新分配到不同的地址),例如通过大量v.push_back(),内部向量的内部数组是否被复制以及(因为向量的复制构造函数通常会复制内部数组),或者 C++ 是否有办法调整外部向量的大小而无需递归复制所有内容?

C++11 移动构造函数会影响这个吗?这是否取决于 STL 实现?

【问题讨论】:

  • 附带说明,字符串对象将被重新分配,而不是字符串本身,因为它们在实例之间共享并且仅在写入时重新分配(即写入时复制)。所以它并不便宜,但每个字符串缓冲区根本不会复制。

标签: c++ vector


【解决方案1】:

是的,在 C++03 中,当外部向量需要重新分配时,内部向量会被复制。在 C++11 中,它们被移动了。仅在实现正确的情况下才取决于实现。如果实现是正确的,这就是行为。

【讨论】:

  • 你能提供一个参考吗?我试图检查 (C++11) 规范,但找不到任何部分定义了在调整向量大小时如何复制存储的数据,除了它应该“使用分配器获取内存”(§23.2.1 /7).
【解决方案2】:

是的,如果向量(“外部”)使用的存储空间不能仅仅扩展,而是移动到不同的地址,那么向量中的数据(无论该数据是什么)必须是也搬家了。这就是为什么向量的迭代器在例如之后总是被认为是无效的。 push_back.

【讨论】:

  • "这就是为什么向量的迭代器在 push_back 之后总是被认为是无效的" -- 除非有 reserve 调用?
  • @Jeffrey,不管有没有预留调用,如果你超过了预留,那么迭代器无论如何都会崩溃。
  • 是的,我知道在外部向量上的 push_back() 之后,外部向量的迭代器应该被认为是无效的,但是如果你在外部向量上调用 push_back,内部向量的迭代器也应该被认为是无效的.
  • @LieRyan 是的,如果数据被移动,迭代器和指向内部向量的指针也应该被认为是无效的。
  • @Jefffrey:实际上,除非你先检查capacity;如果容量已经足够,则无需致电reserve
猜你喜欢
  • 1970-01-01
  • 2018-05-02
  • 2010-12-10
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
相关资源
最近更新 更多