C++ 调整外部向量的大小是否会复制内部向量?

C++ 调整外部向量的大小是否会复制内部向量?,c++,vector,C++,Vector,假设你有一个向量向量: vector<vector<string> > v; 向量v; 当外部向量的内部数组调整大小时(假设内部数组也必须重新分配到不同的地址),例如通过执行大量的v.push_back(),内部向量的内部数组是否也会被复制(因为向量的复制构造函数通常复制内部数组),或者C++有一种方法可以调整外部向量的大小而不递归复制所有的东西? C++11移动构造函数是否会影响这一点?这是否取决于STL实现?是的,在C++03中,当需要重新分配外部向量时,会复制内

假设你有一个向量向量:

vector<vector<string> > v;
向量v; 当外部向量的内部数组调整大小时(假设内部数组也必须重新分配到不同的地址),例如通过执行大量的
v.push_back()
,内部向量的内部数组是否也会被复制(因为向量的复制构造函数通常复制内部数组),或者C++有一种方法可以调整外部向量的大小而不递归复制所有的东西?
C++11移动构造函数是否会影响这一点?这是否取决于STL实现?

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

是的,如果向量(外部)使用的存储不能扩展,而是移动到不同的地址,那么向量中的数据(无论该数据是什么)也必须移动。这就是向量迭代器在一次推送后总是被认为无效的原因。例如,
push_back

“这就是向量迭代器在一次推送后总是被认为无效的原因”——除非有一次
reserve
调用?@Jeffrey,无论是否有reserve调用,如果你超过你的reserve,然后迭代器就失效了。是的,我知道在外向量上执行push_back()之后,外向量的迭代器应该被视为无效的,但是如果在外向量上调用push_back,则内向量的迭代器也应该被视为无效的。@lieyan Yes,如果数据被移动,则指向内部向量的迭代器和指针也应被视为无效。@Jeffrey:实际上,除非您先检查了
容量
;如果容量已经足够,则无需调用
reserve
。作为旁注,字符串对象将被重新分配,而不是字符串本身,因为这些对象在实例之间共享,并且仅在写入时重新分配(即写入时复制)。所以它不便宜,但是每个字符串缓冲区都不会被复制。你能提供一个参考吗?我试图检查(C++11)规范,但找不到任何定义向量调整大小时如何复制存储数据的部分,除非它应该“使用分配器获取内存”(§23.2.1/7)。