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变得悬空.
创建v(vector不是一个好名字,因为它与库共享并使代码混乱)作为指针vector(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
Run Code Online (Sandbox Code Playgroud)
请注意,如果a或b超出范围 before v,这可能会很危险,因为这会给您留下悬空指针、混乱的未定义行为和谋杀耗时的错误。