如何通过引用推送向量?

时间:2018-05-31 00:14:40

标签: c++ vector reference

下面的代码不起作用,因为我将矢量a和b推回到矢量矢量,然后改变矢量a和b。我想改变矢量a和b,以便矢量矢量遭受相同的修改。我该怎么做?

#include <iostream>
#include <vector>

int main()
{
std::vector<std::vector<int>>vector;
std::vector<int>a;
std::vector<int>b;
vector.push_back(a);
vector.push_back(b);
for (int i = 1; i <= 10; i++)
    a.push_back(i);
for (int i = 11; i <= 20; i++)
    b.push_back(i);
std::cout << vector[1][0];
std::cin.get();
}

4 个答案:

答案 0 :(得分:11)

您可以使用std::reference_wrapper(自C ++ 11起)。

  

std::reference_wrapper是一个类模板,它在可复制的可分配对象中包装引用。它经常被用作在标准容器(如std::vector)中存储引用的机制,它通常不能保存引用。

e.g。

std::vector<std::reference_wrapper<std::vector<int>>> v;
std::vector<int> a;
std::vector<int> b;
v.push_back(a);
v.push_back(b);
for (int i = 1; i <= 10; i++)
    a.push_back(i);
for (int i = 11; i <= 20; i++)
    b.push_back(i);
std::cout << v[1].get()[0]; //11

LIVE

请注意,如果vector的时间超过ab,那么当ab被销毁时,存储在{vector 1}}变得悬空。

答案 1 :(得分:4)

创建// START REQUEST Request ("6ee776c5-2b4e-4888-b83b-ea6dddcae263"), Endpoint activated (invocation #: 4) ("GET /api/items/:itemKey") [FIREBASE]{96328ms} p:1: Listen called for /items/-LDhjV8Hkievzbh5UVfz default [FIREBASE]{96328ms} p:1: Listen on /items/-LDhjV8Hkievzbh5UVfz for default [FIREBASE]{96328ms} p:1: {"r":42,"a":"q","b":{"p":"/items/-LDhjV8Hkievzbh5UVfz","h":""}} [FIREBASE]{97842ms} p:1: handleServerMessage d {"p":"items/-LDhjV8Hkievzbh5UVfz","d":{"baseSpec":"-LDIezNhwWX8OmoWXZO3","createdAt":1527628300934,"id":"-LDhjV8Hkievzbh5UVfz","label":"Testing","panels":{"-LDhjV5y1mAwPmJkE4d3":true},"targetSpec":"-LDIezNqbVuvkpr9WEf8","x":{"-LD8Ap4ujTBp_GP5jTv9":true},"y":{"-LD89GHnTYjh99W8ltsY":true}}} [FIREBASE]{97843ms} event: /items/-LDhjV8Hkievzbh5UVfz:value:{"baseSpec":"-LDIezNhwWX8OmoWXZO3","createdAt":1527628300934,"id":"-LDhjV8Hkievzbh5UVfz","label":"Testing","panels":{"-LDhjV5y1mAwPmJkE4d3":true},"targetSpec":"-LDIezNqbVuvkpr9WEf8","x":{"-LD8Ap4ujTBp_GP5jTv9":true},"y":{"-LD89GHnTYjh99W8ltsY":true}} [FIREBASE]{97843ms} p:1: Unlisten called for /items/-LDhjV8Hkievzbh5UVfz default [FIREBASE]{97843ms} p:1: Unlisten on /items/-LDhjV8Hkievzbh5UVfz for default [FIREBASE]{97843ms} p:1: {"r":43,"a":"n","b":{"p":"/items/-LDhjV8Hkievzbh5UVfz"}} [FIREBASE]{97844ms} p:1: from server: {"r":42,"b":{"s":"ok","d":{}}} Request ("6ee776c5-2b4e-4888-b83b-ea6dddcae263"), Firebase items READ Success ("id: -LDhjV8Hkievzbh5UVfz"): 1516ms v不是一个好名字,因为它与库共享并使代码混淆)成为vector vector个指针(因为{ {3}}):

vector

请注意,如果std::vector<std::vector<int> *> v; //declare as vec of vec pointers ... v.push_back(&a); //push_back addresses of a and b v.push_back(&b); ... std::cout << v.at(1)->at(0) //dereference and call at on the inner vec a超出b之前的范围,这可能会有危险,因为这会让您留下悬空指针,一堆未定义的行为和谋杀时间 - 消耗错误。

答案 2 :(得分:1)

基本问题是push_back 将其参数复制到向量的末尾。要修改向量中的对象,需要获取对它的引用。一种方法:

std::vector< std::vector<int> > my_vector;
my_vector.reserve(2);  // Going over the allocation invalidates references

my_vector.push_back( std::vector<int>() );
std::vector<int> & a = my_vector.back();

my_vector.push_back( std::vector<int>() );
std::vector<int> & b = my_vector.back();

(我更改了变量的名称,因为使用&#34; vector&#34;作为变量名称往往会导致混淆。)

如果你可以使用C ++ 17,有一种方法可以使用emplace_back来减少代码行。

答案 3 :(得分:0)

如果您提前知道向量的数量,可以这样做:

std::vector<std::vector<int>> v(2);
std::vector<int> &a = v[0];
std::vector<int> &b = v[1];
...