1. ホーム
  2. c++

[解決済み] std::transformとstd::for_eachの違いは何ですか?

2022-03-05 20:40:26

質問

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

高い次元で

  • 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;
}