Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 変更アルゴリズム | イントロダクション
C++ STLコンテナとアルゴリズム

book変更アルゴリズム

メニューを表示するにはスワイプしてください

C++標準ライブラリにおける修正アルゴリズムは、コンテナの内容を効率的かつ表現力豊かに変更するための重要なツール。最も一般的に使用される修正アルゴリズムには、std::copystd::replace、および**std::remove**が含まれる。

これらのアルゴリズムはイテレータ範囲で動作し、柔軟性が高くコンテナに依存しない設計となっている。

main.cpp

main.cpp

copy
1234567891011121314151617
#include <iostream> #include <list> #include <algorithm> int main() { std::list<int> numbers = {1, 2, 3, 2, 4, 2, 5}; // Replace all occurrences of 2 with 99 std::replace(numbers.begin(), numbers.end(), 2, 99); // Remove all elements greater than 90 using remove_if numbers.remove_if([](int n){ return n > 90; }); for (int n : numbers) std::cout << n << " "; }

std::vectorstd::deque などのコンテナを使用する場合、std::remove のようなアルゴリズムは実際には要素を削除しません。代わりに、残りの要素を前方に移動し、新しい論理的な末尾へのイテレータを返しますが、コンテナのサイズは変わりません。要素を完全に削除するには、そのイテレータを使ってコンテナの erase 関数を呼び出します。これは erase-remove イディオム として知られる一般的なパターンです。

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {1, 2, 3, 2, 4, 2, 5}; // Remove all occurrences of 2 auto new_end = std::remove(numbers.begin(), numbers.end(), 2); numbers.erase(new_end, numbers.end()); for (int n : numbers) std::cout << n << " "; }
Note
注意

コンテナの末尾に無効なデータが残らないように、必ず std::removeerase を組み合わせて使用。

question mark

std::vectorを使ってstd::removeから要素を削除する際に、erase-removeイディオムを使用しなければならない理由として最も適切な説明はどれですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  9

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  9
some-alt