55

C++ では、すべてのベクトル要素に対して実行されるループを使用せずに、ベクトルの各要素で関数を呼び出す方法はありますか? Python の「マップ」に似たもの。

4

8 に答える 8

64

はい: std::for_each.

#include <algorithm> //std::for_each

void foo(int a) {
    std::cout << a << "\n";
}

std::vector<int> v;

...

std::for_each(v.begin(), v.end(), &foo);
于 2012-05-09T12:51:43.623 に答える
60

あなたはすでに言及しているいくつかの答えを得ていますstd::for_each

これらはあなたが尋ねた質問に答えますが、少なくとも私の経験でstd::for_eachは、標準的なアルゴリズムの中で最も有用性が低いことを付け加えておきます。

私は(一例として)を使用します。std::transformこれは基本的にa[i] = f(b[i]);、またはresult[i] = f(a[i], b[i]);それよりもはるかに頻繁ですstd::for_each。多くの人がstd::for_eachコレクションの要素を印刷するために頻繁に使用します。その目的のために、目的std::copystd::ostream_iteratorとしての方がはるかにうまく機能します。

于 2012-05-09T13:24:39.710 に答える
27

C ++ 11の場合:ラムダを使用できます。例えば:

std::vector<int> nums{3, 4, 2, 9, 15, 267};

std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });

参照:http ://en.cppreference.com/w/cpp/algorithm/for_each

于 2012-05-09T13:04:48.467 に答える
9

C++11 を使用している場合は、さらに短い方法があります: ranged-based for . その目的はまさにこれです。

std::vector<int> v {1,2,3,4,5};

for (int element : v)
    std::cout << element; //prints 12345

必要に応じて参照と const を適用することも、型が long の場合は auto を使用することもできます。

std::vector<std::vector<int>> v {{1,2,3},{4,5,6}};

for (const auto &vec : v)
{
    for (int element : vec)
        cout << element;

    cout << '\n';
} 

出力:

123
456
于 2012-05-09T12:58:49.763 に答える
7

使用for_each:

// for_each example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void myfunction (int i) {
  cout << " " << i;
}

struct myclass {
  void operator() (int i) {cout << " " << i;}
} myobject;

int main () {
  vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);

  // or:
  cout << "\nmyvector contains:";
  for_each (myvector.begin(), myvector.end(), myobject);

  cout << endl;

  return 0;
}
于 2012-05-09T12:52:27.490 に答える
2

std::for_eachを使用できます。これは、反復子と関数またはファンクターのペアを取ります。

于 2012-05-09T12:52:25.327 に答える