我怎么指向向量元素
How can I point to the vector elements?
a)指向vector元素的地址是否安全?
unsigned int* ptr;
std::vector<unsigned int> vec;
vec.resize(10);
vec[0] = 10;
ptr = &vec[0];
在我看来,只要我不改变预分配向量的大小,&vec[0]的地址不会改变。我的问题是,如果指向一个vector元素是安全的,只要它是预先分配的。
b)如果我不预先分配vec的大小,&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
看起来index_vec
向量之前没有重新大小,添加第二项'1'会导致STL分配更多内存,从而将原始缓冲区移动到其他地方。
尝试重新调整index_vec
向量的大小以保留缓冲区
以index_vec.resize(10);
为例,预留10个位置的内存。
编辑至于你的问题——"安全"取决于用法……这是可行的,但指向STL vector内部缓冲区可能非常非常不安全。
如果向量是预分配的,(使用resize
)项的地址保持不变。但是如果你把一个额外的项压入向量,STL可能会改变内存位置(这就是STL的好处……内存管理属于库,而不是我们;-))
对于你实际的问题:
我的问题是,如果指向一个vector元素是安全的,只要它是预先分配的
是的,它是。只要你预先分配了它的内容,并且你不以任何方式改变它的大小。
阅读std::vector
的文档,了解导致这种指针操作不安全的方法列表。(查找"使指针无效"的方法。)
同样,请参阅与迭代器无效相关的问答,这是一个类似的概念。
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 在 C++ 中输出枚举类类型的向量元素
- 用向量的向量元素初始化向量的空向量
- 为什么不允许使用可变长度数组作为向量元素?
- 在函数中传递向量元素
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- 返回向量元素的 l 值的正确方法是什么?
- 当向量增长时,指向向量元素的C++指针是否无效
- 如何在C++中从一个向量元素减去std::unorderede_map向量元素并更新它
- C++:向量元素赋值导致访问冲突
- 将向量元素与字符串元素进行比较,而不初始化向量
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 使用递归C++向量元素的总和
- 如何查找为数组中的最低值编制索引的向量元素
- 限制指针访问STL ::向量元素
- 访问索引指向向量元素时的seg故障 - 做错了什么
- 如何使用指针访问向量元素的各个元素
- 向量元素数据损坏了Find()操作
- 将字符值分配给向量元素.C