2012-05-09 12 views

答えて

28

はい:std::for_each

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

std::vector<int> v; 

... 

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

(ループとは対照的に)これを使用することで速度の向上が期待できますか? – dbliss

+2

@dblissの場合、 'for_each()'の実装はまったく同じループであり、テンプレートを使用するので違いはありません。しかし、C++ 17では、並列性が導入される可能性があります。これは完全に透過的であり、より早く始めることができます。 –

8

使用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; 
} 
6

あなたが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'; 
} 

出力:C++ 11で

123 
456 
+0

この構文は、vs2011ではまだサポートされていません。少なくとも私のコピーではありませんが、+1。 – ervinbosenbacher

+0

@xebo、ああ、これはC++ 11の最高の機能のひとつであると考えています。 – chris

+0

将来の訪問者には、ranged-forがVisual Studio 2012に追加されました。 – chris

11

:あなたは、ラムダを使用することができます。たとえば:

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

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

REF:http://en.cppreference.com/w/cpp/algorithm/for_each

+0

実際にranged-forを使用するとよい解決策はありません。 – chris

27

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

質問に答えても、少なくとも私の経験では、std::for_eachは、で、標準的なアルゴリズムに役立ちます。

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

+3

これは私が探していた答えです。 'transform'は' for_each'よりPythonの 'map'に近いです。' map'は出力のリストを生成するのに対し、 'for_each'は関数を呼び出しますが出力を破棄します。 –

関連する問題