引用向量中的特定索引

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,但是一旦我将一个新项目推到向量上,该值就变得未定义。为什么一旦我将更多项目推到矢量上,我的指针就会变得未定义?

向量保证有连续的项目。当您添加新项目或增加其大小时,它也保证会增长。这意味着添加新项目 可能 需要移动向量并使指向其元素的所有指针无效。

已解释 here. More specifically, pointers and iterators can be invalidated by these vector operations. This great SO question 概述了所有标准容器上的迭代器失效。

如果您需要保留指针或对元素的引用,您可以查看 或切换到具有不同失效规则的容器,例如 map<int, int>.

当项目数量超过当前容量时,Vector 会更改项目在内存中的存储位置。

如果您添加新项目超过容量,所有项目都将复制到新位置。所以你指的是一个旧地方,该项目不再位于那里。

要不断引用相同的索引,存储索引。在此示例中,商店编号 0。然后,您可以通过调用 a[0].

来检索项目

向向量添加新元素会导致重新分配存储现有元素的内存。因此对这些元素的引用和指针变得无效。

为了避免这种情况你可以使用成员函数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 

即向量 rv 元素中存储的所有指向向量 v 元素的指针都是有效的。