引用向量中的特定索引

Referencing a specific index in a vector

本文关键字:索引 向量 引用      更新时间:2023-10-16

我试图引用向量中的某个索引,但是每当我向向量添加新项目时,指针都不会指向原始值。

我的例子是这样的:

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向量元素中都是有效的。