web-dev-qa-db-ja.com

C ++ベクトルのすべての要素で関数を呼び出す

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

31
vikaspraj

はい: - std::for_each

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

std::vector<int> v;

...

std::for_each(v.begin(), v.end(), &foo);
40

_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::copy_と_std::ostream_iterator_を宛先として使用すると、はるかにうまく機能します。

39
Jerry Coffin

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

16
Indy9000

使用する 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;
}
8

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

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

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

必要に応じて参照とconstを適用することも、タイプが長い場合は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
7
chris

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

2
juanchopanza

OPはPythonの map 関数に言及しています。この関数は、実際にはリスト(または反復可能)のすべての要素に関数を適用し、すべての結果を収集するリスト(または反復可能)を返します。つまり、次のようなことを行います。

def f( x ) : 
   """ a function that computes something with x"""
   # code here 
   return y 

input = [ x1, x2, x3, ... ]
output = map( func, input )  

# output is  now [ f(x1), f(x2), f(x3), ...] 

したがって、Pythonのマップに相当する最も近いC++標準ライブラリは、実際には std::transform ( `ヘッダーから)。

使用例は次のとおりです。

#include <vector>
#include <algorithm> 
using namespace std;

double f( int x ) { 
   // a function that computes the square of x divided by 2.0 
   return x * x / 2.0 ;
}

int main( ) {
  vector<int> input{ 1, 5, 10 , 20};
  vector<double> output;
  output.resize( input.size() ); // unfortunately this is necessary

  std::transform( input.begin(), input.end(), output.begin(), f );

  // output now contains  { f(1), f(5), f(10), f(20) }
  //                     = { 0.5, 12.5,  50.0, 200.0 } 
  return 0;
}   
1
Mateo