我刚注意到,对于vector push_back,它会推回对元素的引用。
void push_back ( const T& x );
我的问题是在push_back之后内存布局是否发生了变化?
例如,我首先有一个数组,其中包含五个元素,布局就像这样。
| | | | | |
| A1 | A2 | A3 | A4 | A5 |
现在我有一个向量v
v.push_back(A3)
现在,内存如何?
矢量如何在这里存储元素?
向量如何访问元素?
答案 0 :(得分:6)
矢量按值存储而不是按引用。
当您重新添加相同的元素时,副本将存储在最后。如果您不想复制要插入vector
的值,那么您应该使用指针。
示例:
std::vector<std::string> v;
string s = "";
v.push_back(s);
s = "hi";
v.push_back(s);
v
现在包含2个不同的元素,一个带有空字符串,另一个带有包含"hi"
的字符串。向量中的两个字符串都与s
无关。
注意:STL容器的内部实现细节可能有所不同,不能保证它会以某种方式实现;但是,无论内部实现是什么,STL容器如何工作的语义都将保持不变。
答案 1 :(得分:3)
现在,内存如何?和向量如何在此处存储元素?
有两种可能的结果:
push_back
'd对象(按值)复制到末尾。向量如何访问元素?
访问C风格数组的方式相同。 BasePointer + index
答案 2 :(得分:2)
vector::push_back
接受引用,然后读取引用处的值以将其复制到向量中。
因此得到的矢量将是
| A3 |
请注意,调整向量大小以容纳新数据时,它可能会将旧数据移动到新位置,从而使旧引用无效。因此,如果列表A1,A2,... A5 是 v
,
v.push_back(A3)
会使A3
A3
引用v
内的数据无效。在向量内部保持数据处理的唯一方法是保存索引;引用,指针和迭代器不会这样做。
答案 3 :(得分:0)
| A1 | A2 | A3 | A4 | A5 | A3 |
元素(如STL中的所有内容)按值存储。
向量访问元素就像内置数组一样。