引用向量中的特定索引
Referencing a specific index in a vector
我试图引用向量中的某个索引,但是每当我向向量添加新项目时,指针都不会指向原始值。
我的例子是这样的:
std::vector<int> a;
a.push_back(1);
int* a_1 = &a[0];
a.push_back(2);
当我这样做时:
int* a_1 = &a[0];
它引用的第一个值是 1,但是一旦我将一个新项目推送到向量上,该值就会变得未定义。为什么一旦我将更多项目推送到矢量上,我的指针就会变得未定义?
Vector 更改当项目数超过当前容量时存储项目在内存中的位置。
如果添加新项目超过容量,则所有项目都将复制到新位置。因此,您引用的是该项目不再所在的旧位置。
若要持续引用同一索引,请存储索引。在此示例中,商店编号0
。然后,可以通过调用a[0]
来检索该项目。
向量保证具有连续项。 当您添加新项目或增加其大小时,它也保证会增长。 这意味着添加新项可能需要移动矢量并使指向其元素的所有指针失效。
这里解释过。更具体地说,指针和迭代器可能会被这些vector
操作失效。这个伟大的SO问题概述了所有标准容器上的迭代器失效。
如果您需要保留对元素的指针或引用,您可以查看此 SO 问题或切换到具有不同失效规则的容器,例如map<int, int>
。
向向量添加新元素可能会导致重新分配存储现有元素的内存。因此,对这些元素的引用和指针将变得无效。
为避免这种情况,您可以使用成员函数reserve
初步保留足够的内存。
例如
std::vector<int> a;
a.reserve( 2 );
a.push_back(1);
int* a_1 = &a[0];
a.push_back(2);
std::cout << *a_1 << 'n';
这是一个演示程序。
#include <iostream>
#include <functional>
#include <vector>
int main()
{
const size_t N = 10;
std::vector<int> v;
v.reserve( N );
std::vector<std::reference_wrapper<int>> rv;
int value = 1;
for ( size_t i = 0; i < N; i++ )
{
v.push_back( value++ );
rv.push_back( std::ref( v.back() ) );
}
for ( const auto &r : rv )
{
std::cout << r << ' ';
}
std::cout << 'n';
return 0;
}
程序输出为
1 2 3 4 5 6 7 8 9 10
这是指向向量元素的所有指针v
存储在rv
向量元素中都是有效的。
相关文章:
- 在C++中调整向量中的索引
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 将转换字符键入 int 以用作向量C++的索引
- 在对向量中查找元素的索引
- 如何检查类实例向量的索引是否为空
- 如何根据排序索引的向量对 std::index 集进行排序?
- C++ 中字符串向量的索引
- 如何在C++中返回向量的从零开始的索引
- 向量索引变量声明(size_t 或 std::vector<DATATYPE>::size_type)
- 特征获取索引数组,其中向量中的值为真(不需要循环)
- 引用向量中的特定索引
- 在C++中从距离矩阵创建索引向量的最快方法
- 在python gdb脚本中索引c ++向量
- 使用索引向量擦除另一个向量的索引
- 根据索引向量对向量重新排序 - 更新
- C++11将智能指针的索引向量作为类的成员
- 使用auto关键字填充双索引向量
- C++对不带lambda的索引向量进行排序
- 如何从Eigen中的索引向量中提取子向量(Eigen::Vector)
- 通过索引向量对犰狳矩阵的所有列进行排序的最佳方法