我怎样才能指向向量元素?

时间:2014-05-21 18:48:48

标签: c++ pointers vector

a)指向矢量元素的地址是否安全?

unsigned int* ptr;
std::vector<unsigned int> vec;
vec.resize(10);
vec[0] = 10;
ptr = &vec[0];

在我看来,只要我不改变预分配矢量的大小,&amp; vec [0]的地址就不会改变。我的问题是,只要它被预先分配就可以安全地指向一个向量元素。

b)如果我没有预先分配vec的大小,那么&amp; vec [0]的地址似乎会改变。如果我通过vec.push_back()将其他值推送到向量。 我想有一个指向矢量指针的矢量。

std::vector<unsigned int*> ptr_vec(10,0);
std::vector<unsigned int> index_vec;
index_vec.push_back(0);
ptr_vec[0] = &index_vector[0];
ptr_vec[1] = ptr_vec[0];
index_vec.push_back(1); // at this point the adress of &index_vec[0] changes. thats my problem

2 个答案:

答案 0 :(得分:2)

看起来index_vec向量之前没有重新调整大小,添加第二项&#39; 1&#39;导致STL分配更多内存,从而将原始缓冲区移动到其他位置。

尝试重新调整index_vec向量的大小以保留缓冲区。

例如,使用index_vec.resize(10);来保留10个位置的内存。

修改 以及你的问题 - &#34; safe&#34;取决于用法...它是可行的,但可能非常非常安全地指向STL向量内部缓冲区。

如果向量预分配,(使用resize)项目&#39;地址得以维持。但是如果你向向量推送一个额外的项目,STL可能会改变内存位置(这是关于STL的好处......内存管理由库拥有,而不是我们;-))

答案 1 :(得分:1)

所以回答你的实际问题:

  

我的问题是,如果指向一个向量元素是安全的,只要它是预分配的

是的,确实如此。只要您预先分配其内容并且不以任何方式更改其大小。

Read the documentation of std::vector获取使这种指针操作不安全的方法列表。 (搜索被称为的方法“使指针无效”。

另外,请参阅this related question and answer,它是关于迭代器失效的,类似的概念。