0

ベクトルから一連の連続していない要素 (私はそれらの位置を持っています) を削除する最速の方法は何ですか? または、これらの要素なしで新しいベクトルを取得します。

たとえば、ベクトル v1 = <5, 9, 6, 7, 12, 0, 3> があります。そして、ベクトル rem = <0, 3, 4, 6> を削除したい位置のベクトル、または要素を削除する必要があるかどうかに応じて true/false を含むベクトル rem = があります。その場合、新しいベクトルはベクトル v2 = <9, 6, 0> になります。

4

3 に答える 3

2

元のベクトル内の要素の順序が重要でない場合は、削除するインデックスを昇順で繰り返し(これは重要です)、各要素がベクトル内の最後の要素と交換してから呼び出すことをお勧めしますpop_back

また、スワップを実行する前に、ベクトルの最後の要素が削除されるかどうかを確認するためのチェックを実行する必要があります。最後の要素のインデックスも削除されるものの中にありますpop_backスワップとを実行しpop_backます。

編集:明確にするために-削除する要素のインデックスはすでに並べ替えられているので、インデックスの配列でまだ削除していない最後の値をチェックするだけで、最後の要素を削除するかどうかを確認できます。ヘルパー整数インデックスを使用して、そのインデックスがどれであるかを追跡し、インデックスの配列のサイズに初期化してマイナス1を削除し、最後の要素が削除されるたびに1ずつデクリメントします。

于 2013-01-24T14:49:33.837 に答える
0

マージアルゴリズムのように、ベクトルを一緒に繰り返します。このようなもの:

int index1=0, index2=0;

while (index1 < v1.size()) {
    if ( index2 < rem.size() && index1 == rem[index2] ) {
        index2++; // skip this one
    }
    else {
        v2.push_back(v1[index1]); // keep this one
    }

    index1++;
}

イテレータを使用するとよりクリーンになり、remベクトルをソートする必要があることに注意してください。

編集:インデックスベクトルに3番目の変数名を使用して修正しました。

于 2013-01-24T14:49:39.363 に答える
0

最速で、最短のコード量と少しの最適化を想定しています。

size_t i = 0;
size_t end = v1.size();
vector<int> vresult;

vresult.reserve(v1.size() - rem.size()); // avoid reallocations

size_t remIt = 0;
for ( ; i != end; ++i )
{
  if ( i != rem[remIt] )
    vresult.push_back(v1[i]); // push our element into the new vector
  else
    remIt++;
}

コンパイルできない可能性があります。上記のコードは、純粋にそのアルゴリズムのために書かれています。

于 2013-01-24T14:53:08.600 に答える