如何通过引用推送向量?

phi*_*dvd 0 c++ reference vector

下面的代码不起作用,因为我将矢量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();
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 11

你可以使用std::reference_wrapper(从C++ 11开始).

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

例如

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
Run Code Online (Sandbox Code Playgroud)

生活

请注意,如果vector时间比a和时间长b,那么当被破坏时a,b存储在其中的引用vector变得悬空.


sco*_*001 5

创建vvector不是一个好名字,因为它与库共享并使代码混乱)作为指针vectorvector因为引用向量是不可能的):

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
Run Code Online (Sandbox Code Playgroud)

请注意,如果ab超出范围 before v,这可能会很危险,因为这会给您留下悬空指针、混乱的未定义行为和谋杀耗时的错误。