我想创建一个vector<vector<int>>
,其中外部向量是固定的(始终包含相同的向量),但内部向量可以更改。例如:
int n = 2; //decided at runtime
assert(n>0);
vector<vector<int>> outer(n); //outer vector contains n empty vectors
outer.push_back(vector<int>()); //modifying outer vector - this should be error
auto outer_it = outer.begin();
(*outer_it).push_back(3); //modifying inner vector. should work (which it does).
我尝试只做const vector<vector<int>>
,但这甚至使内部向量const
。
我是创建自己的自定义FixedVectors
课程的唯一选择,还是有更好的方法可以做到这一点?
答案 0 :(得分:2)
向量是表示可以更改的数组的序列容器 尺寸。就像数组一样,矢量使用连续的存储位置 它们的元素,这意味着它们的元素也可以被访问 在常规指向其元素的指针上使用偏移量,同样如此 在数组中有效。但与阵列不同,它们的大小可以改变 动态地,由它们自动处理它们的存储 容器
如果您不希望数据结构发生变化,则矢量可能不是外层的最佳选择,如何使用矢量数组。这样,数组具有固定的大小,无法修改,同时仍然可以自由地在运行时声明其大小。
vector<int> *outer;
int VectSize;
cout >> "size of vector array?"
cin >> VectSize;
outer = new vector<int>[VectSize]; //array created with fixed size
outer.push_back() //not happening
答案 1 :(得分:1)
const vector<unique_ptr<vector<int>>> outer = something(n);
对于某些东西,你可以编写一个函数,如下所示:
vector<unique_ptr<vector<int>>> something(int n)
{
vector<unique_ptr<vector<int>>> v(n);
for (auto & p : v)
p.reset(new vector<int>);
return v;
}
答案 2 :(得分:1)
将外部向量包装到一个只提供at,begin,end和operator []的类中。让类只有一个构造函数占用它的容量。
这很可能是最好的方式。