12

ベクトルから単一の要素を取得し、それをベクトルの後ろにプッシュしてから削除しようとしているので、メモリに空のセクションがありません。消去-削除イディオムはこれを行うことができますが、特定の値のすべてのインスタンスを削除します。最初のものを削除したいだけです。

私は標準ライブラリアルゴリズムの経験があまりなく、これを行うための適切な方法(ある場合)を見つけることができません。次に例を示します。

int main() {
    std::vector<int> v{1, 2, 3, 3, 4};

    remove_first(v, 3);

    std::cout << v; // 1, 2, 3, 4
}

では、このベクトルから3の最初の出現を削除するにはどうすればよいでしょうか。

4

2 に答える 2

21

最初に見つけてから消去します。

auto it = std::find(v.begin(),v.end(),3);
// check that there actually is a 3 in our vector
if (it != v.end()) {
  v.erase(it);
}
于 2013-02-06T20:09:15.073 に答える
11

ベクトル内の要素の順序を維持する必要がない場合は、消去時に残りの要素の「テール」のコピーを回避できます。

auto it = std::find(v.begin(), v.end(), 3);
if (it != v.end()) {
  std::iter_swap(it, v.end() - 1);
  v.erase(v.end() - 1);
}
于 2013-02-07T14:37:01.287 に答える