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

外側のベクトルを、at、begin、end、および operator [] だけを提供するクラスにラップします。クラスがその容量を取得するコンストラクターを 1 つだけ持つようにします。

これはおそらく最良の方法です。

于 2012-12-08T11:42:46.893 に答える
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 に答える