引用向量中的特定索引
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
元素的指针都是有效的。
我正在尝试引用向量中的某个索引,但每当我向向量中添加新项目时,指针都不指向原始值。
我的例子是这样的:
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
元素的指针都是有效的。