1. ホーム
  2. c++

std::transformとstd::for_eachの違いは何ですか?

2023-10-04 15:52:08

質問

どちらも要素の範囲に関数を適用するために使用することができます。

高いレベルでは

  • std::for_each は、関数の戻り値を無視し、実行順序を保証します。 実行順序を保証します。
  • std::transform はイテレータに戻り値を代入し、実行順序を保証しません。 実行順序を保証するものではありません。

どのような場合に、一方と他方を使い分けるのがよいのでしょうか?また、微妙な注意点はありますか?

どのように解決するのですか?

std::transform と同じです。 map . このアイデアは、2つのイテレータの間にある各要素に関数を適用し、その関数の適用結果の要素で構成される別のコンテナを取得することです。例えば,オブジェクトのデータメンバを新しいコンテナに投影するような使い方が考えられます.以下では std::transform のコンテナを変換するために使用されます。 std::string のコンテナで std::size_t s.

std::vector<std::string> names = {"hi", "test", "foo"};
std::vector<std::size_t> name_sizes;

std::transform(names.begin(), names.end(), std::back_inserter(name_sizes), [](const std::string& name) { return name.size();});

一方 std::for_each を単独で副作用のために実行します。つまり std::for_each は単純な範囲ベースの for ループに似ています。

文字列の例に戻ります。

std::for_each(name_sizes.begin(), name_sizes.end(), [](std::size_t name_size) {
    std::cout << name_size << std::endl;
});

実際、C++11 以降では、同じことを範囲ベースの for ループを使用することで、より長い表記で同じことが実現できます。

for (std::size_t name_size: name_sizes) {
    std::cout << name_size << std::endl;
}