2

行列の対角線を格納するSTLベクトルがあります。私が実装している特定の数学的規則は、元のベクトルを取得し、そのベクトルのコピーをそれ自体に連結するだけで、テンソル積の対角線の新しい行列を生成できることを示しています(サイズが2倍になり、値は1/の後に繰り返されます) 2 * size())。

私は次のコードを書きました:

std::vector<int> aVec;

for (int k = 0; k < aVec.size(); k++) aVec.insert(aVec.end(), aVec[k]);

しかし、これを試してみると、セグメンテーション違反が発生します。aVecのコピーを作成し、それを挿入「値」として使用し、ループ引数のsize()に使用すると、機能しますが、これらの両方を実行する必要があります(そうでない場合でも、セグメンテーション違反)。

この実装が機能しない原因となる下で何が起こっているのかを誰かが説明できますか?

4

3 に答える 3

4

イテレータベースの操作を使用します:

vec.reserve(vec.size() * 2);
vec.insert(vec.end(), vec.begin(), vec.end());
于 2012-07-16T19:31:15.087 に答える
3

アイテムを無期限にコピーします。前もってコピーする数に注意してください。

size_t n = aVec.size();
for (int k = 0; k != n; ++k)
  aVec.push_back(aVec[k]);

多くの C++ アルゴリズムはイテレータbegin()end()イテレータを使用してより適切に表現されますが、この場合、コンテナを変更するとイテレータが無効になる可能性があるため、インデックスを介したアクセスが優れていますが、要素へのアクセスは有効なままです。ただし、reserveその無効化を回避するために使用できます。

aVec.reserve(2*aVec.size());
std::copy(aVec.begin(), aVec.end(), std::back_inserter(aVec));
于 2012-07-16T19:29:55.087 に答える
1

aVec に要素を追加する前に、aVec.size() の値を一度読み取る必要があります。

于 2012-07-16T19:29:31.567 に答える