关于矢量push_back的一个问题

时间:2010-03-11 03:12:21

标签: c++ vector

我刚注意到,对于vector push_back,它会推回对元素的引用。

void push_back ( const T& x );

我的问题是在push_back之后内存布局是否发生了变化?

例如,我首先有一个数组,其中包含五个元素,布局就像这样。

|          |          |          |          |          |              
|   A1     |     A2   |   A3     |    A4    |    A5    |

现在我有一个向量v

v.push_back(A3)

现在,内存如何?

矢量如何在这里存储元素?

向量如何访问元素?

4 个答案:

答案 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)

现在,内存如何?向量如何在此处存储元素?

有两种可能的结果:

  1. 向量的内存块不够大,无法包含项目,因此会重新分配底层内存。将对象(使用其复制构造函数)复制到新位置。然后将push_back'd对象(按值)复制到末尾。
  2. 向量的内存块足够大,新元素被复制(按值)到最后。
  3. 向量如何访问元素?

    访问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中的所有内容)按值存储。

向量访问元素就像内置数组一样。