2

我想创建一个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类的唯一选择,还是有更好的方法来做到这一点?

4

3 回答 3

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
于 2012-12-08T10:59:52.590 回答
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;
}
于 2012-12-08T11:00:52.217 回答
1

将外部向量包装成一个只提供 at、begin、end 和 operator [] 的类。让类只接受一个构造函数占用它的容量。

这很可能是最好的方法。

于 2012-12-08T11:42:46.893 回答