在非常量向量中,地址进入常量向量是否稳定?

3

如果我有一个 std::vector<std::vector<char>>

其中以下为真:

  • 内部向量的大小从不更改
  • 外部向量的大小通过插入和删除发生变化

我是否可以像这样将地址传递到内部矢量中,在修改外部矢量后使用并且是安全的?

std::vector<std::vector<char>> buffer;

#include <code that inserts into "buffer" uhhh 10 vectors with 100 char each>

char * ch = buffer[5].data();

// example of code that never erases/resizes the vector "ch" is pointing into...
// ... BUT will remove/insert vectors around it, prompting "buffer" to reallocate
buffer.erase(buffer.begin(), buffer.begin() + 4); 
buffer.shrink_to_fit();
buffer.insert(buffer.begin(), std::vector<char>(1)); 

assert(buffer[1].data() == ch);    // the 5th inner-vector moved to index 1
printf("how is this bit%c?", *ch); // but hopefully "ch" is still valid?


2
自从C++11以来,您应该是安全的,因为当“外部”向量被调整大小时,“内部”向量会被移动而不是复制。请注意,由于小缓冲区优化,这对std::string无效。 - Kaznov
1个回答

3
如果外部向量必须增长,它将分配一个新的缓冲区,并将所有内部向量移动到该缓冲区。 这意味着这些内部向量的地址将改变,但这并不意味着内部向量缓冲区的地址会改变。 当移动向量时,它必须保持不使任何迭代器/引用/指向向量元素的指针失效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接