0

こんにちは、以下の情報をベクトル形式のベクトルで保存する必要があります...

 vector <vector <int>> ph;
 vector<int> p, q;
 p.push_back(1);
 p.push_back(2);
 p.push_back(3);

 q.push_back(10);
 q.push_back(20);
 q.push_back(30);
 q.push_back(40); 

使用する代わりに:

 ph.push_back(p);
 ph.push_back(q);

使いたい:

 ph.at(0)=p
 ph.at(1)=q

(これは、これを使用しているときに発生するエラーです: 'std::out_of_range' what(): vector::_M_range_check のインスタンスをスローした後に呼び出された終了)

このように保存したい理由は....後で、インデックス、つまり1または0で識別される特定のベクトルの要素にアクセスしたいからです。

たとえば、ph[0].size()、つまり p のサイズにアクセスしたい...そのインデックスで識別されます。つまり、C++ の単純な配列の場合と同じ操作を実行したいと考えています。つまり、その配列の特定のインデックスにデータを格納し、特定のインデックスからデータにアクセスします。

4

3 に答える 3

2

ベクトルのベクトルをインスタンス化すると、サイズが 0 になり、at()メソッドが境界チェックを実行して例外を発生させることが許可されるため、エラーが発生します。

そのようなインデックスでアクセスしたい場合は、std::mapまたはstd::unordered_mapを使用することをお勧めします。これにより、インデックスは挿入順序に依存しなくなります。

std::map<int, std::vector<int>> MapOfVectors;
std::vector<int> p, q;
// fill vectors
MapOfVectors[1] = q;
MapOfVectors[0] = p;

それ以外の場合は、ベクトルのベクトルがインデックスで要素を挿入するのに十分な大きさであることを確認する必要があります。

// instantiate vector with size 2. You can insert p and q by index. (0, 1) only
vector<vector<int>> ph(2); 

または、作成後にサイズを変更します。

vector<vector<int>> ph;
ph.resize(2);
于 2012-05-31T05:35:33.710 に答える
0

使いたい:

ph.at(0)=p  ph.at(1)=q 

これは、配列の終わりを超えてインデックスにアクセスしようとするため、例外です。

この方法で保存したい理由は....後で、そのインデックス、つまり1または0で識別される特定のベクトルの要素にアクセスしたいからです。

たとえば、ph [0] .size()、つまりインデックスで識別されるp...のサイズにアクセスしたいと思います。つまり、c ++の単純な配列の場合と同じ操作を実行したいと思います。つまり、特定のインデックスでその配列にデータを格納し、特定のインデックスのデータにアクセスします。

これを実現するには、最初に外側のベクトルを空の内側のベクトルで埋めます。

vector<vector<int> > ph(2);

ここで、2は、2つのデフォルトで構築された要素(それ自体vector<int>)を含むように外部ベクトルを構築することを示しています。

または、次を使用することもできます。

vector<vector<int> > ph;
ph.resize(2);

それが済んだら、デフォルトで作成されていない値を格納するために要素にアクセスしても安全です。つまり、以下はスローされません。

ph.at(0)=p;  ph.at(1)=q;
于 2012-05-31T05:44:32.250 に答える
0

vector<vector<int>> phベクトルを定義すると、ph空になります。メンバー関数は境界チェックを行い、.at()存在しない要素に書き込もうとすると例外を正しくスローします。

ph.resize(2)インデックス 0-1 が有効になるようにするか、現在のように使用することができpush_backます。

于 2012-05-31T05:40:02.773 に答える