向量中的每个元素都有唯一的内存地址吗?

时间:2016-10-01 00:42:38

标签: c++ vector

C ++相当陌生。参考这段代码:

for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';

特别是在初始化迭代器和结束条件时。向量中的每个元素是否都有唯一的内存地址指向?或者迭代器的工作方式与指针不同吗?

4 个答案:

答案 0 :(得分:6)

虽然迭代器不一定是指针(虽然对于std::vector大多数非调试实现将它们实现为指针的精简包装器),std::vectorguaranteed以使其元素在内存中连续。这意味着 YES ,每个元素都有一个不同的内存位置。

答案 1 :(得分:2)

每个元素确实在内存中都有唯一的地址。基本上,让我们看一下这个样本向量:

template <class T>
class vec
{
public:
 vec() ;
 ~vec() ;
 T * elements;
} 

你可以看到这里只是一个矢量的例子。所以迭代器的作用是指向元素中的每个指针。它们本身可能没有唯一的地址,但它们指向向量中的每个元素。因此每个迭代器都有 UNIQUE 内存地址。

就像我在评论中所说的那样,它们的工作方式不同,因为Vector和它们的迭代器是由像你这样的人使用C ++制作的库。它们与使用C ++语言构建的指针的工作方式不同。

同样来自参考文献:( C ++ 0x草案):

  

23.2.6类模板向量[向量]

     

1 vector是一个支持随机访问迭代器的序列容器。另外,它支持(摊销)   最后的恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。存储   管理是自动处理的,但可以提供提示以提高效率。一个元素   向量是连续存储的,这意味着如果vvector<T, Allocator>,其中T是其他类型的其他类型   而不是bool,它遵循所有&v[n] == &v[0] + n的身份0 <= n < v.size()

答案 2 :(得分:2)

每个对象(在特定时间存在)都有唯一的地址。向量的元素是对象(除了具有std::vector<bool>特化的憎恶)。所以是的,他们都有独特的地址。但请记住,当您向向量添加元素时,它可能会重新分配。当它重新分配时,所有旧对象都被销毁并移动到具有不同地址的新对象,旧的内存可以自由重用,可能是通过进一步重新分配相同的向量。以下是可能的,例如:

std::vector<int> v;
v.push_back(0);
std::intptr_t a0 = (std::intptr_t)&v[0];

v.push_back(1); // a reallocation may happen here
v.push_back(2); // and perhaps another one here

std::intptr_t a2 = (std::intptr_t)&v[2];

if (a0 == a2) {
    std::cout << "This code is unlikely to be executed, but technically possible.";
}

答案 3 :(得分:1)

来自[vector.overview] / 1

  

vector是一个支持随机访问迭代器的序列容器。此外,它支持(摊销)最后的恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。存储管理是自动处理的,但可以提供提示以提高效率。 向量的元素是连续存储的,这意味着如果v是vector<T, Allocator>,其中T是除bool以外的某种类型,则它遵循标识&v[n] == &v[0] + n适用于所有0 <= n < v.size()

强调我的

因为&v[n]对于n中的所有[0, size())都有效,所以向量中的元素都有自己唯一的地址。