如果我有一个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?
如果外部向量必须增长,它将分配一个新的缓冲区并将所有内部向量移动到该缓冲区中。这意味着这些内部向量的地址会改变,但这并不意味着内部向量的缓冲区地址会改变。它们将保持不变,因为vector被要求在移动vector时不会使指向vector元素的任何迭代器/引用/指针失效。