C ++相当陌生。参考这段代码:
for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
特别是在初始化迭代器和结束条件时。向量中的每个元素是否都有唯一的内存地址指向?或者迭代器的工作方式与指针不同吗?
答案 0 :(得分:6)
虽然迭代器不一定是指针(虽然对于std::vector
大多数非调试实现将它们实现为指针的精简包装器),std::vector
是guaranteed以使其元素在内存中连续。这意味着 YES ,每个元素都有一个不同的内存位置。
答案 1 :(得分:2)
每个元素确实在内存中都有唯一的地址。基本上,让我们看一下这个样本向量:
template <class T>
class vec
{
public:
vec() ;
~vec() ;
T * elements;
}
你可以看到这里只是一个矢量的例子。所以迭代器的作用是指向元素中的每个指针。它们本身可能没有唯一的地址,但它们指向向量中的每个元素。因此每个迭代器都有 UNIQUE 内存地址。
就像我在评论中所说的那样,它们的工作方式不同,因为Vector和它们的迭代器是由像你这样的人使用C ++制作的库。它们与使用C ++语言构建的指针的工作方式不同。
同样来自参考文献:( C ++ 0x草案):
23.2.6类模板向量[向量]
1 vector是一个支持随机访问迭代器的序列容器。另外,它支持(摊销) 最后的恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。存储 管理是自动处理的,但可以提供提示以提高效率。一个元素 向量是连续存储的,这意味着如果
v
是vector<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())
都有效,所以向量中的元素都有自己唯一的地址。