C++では、ベクタの各要素に対して関数を呼び出す方法はありますか? Pythonの 'map'と似たもの。C++ベクタのすべての要素で関数を呼び出す
答えて
はい:std::for_each
。
void foo(int a) {
std::cout << a << "\n";
}
std::vector<int> v;
...
std::for_each(v.begin(), v.end(), &foo);
std::for_eachには、イテレータと関数またはファンクタを使用できます。
使用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;
}
あなたが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
この構文は、vs2011ではまだサポートされていません。少なくとも私のコピーではありませんが、+1。 – ervinbosenbacher
@xebo、ああ、これはC++ 11の最高の機能のひとつであると考えています。 – chris
将来の訪問者には、ranged-forがVisual Studio 2012に追加されました。 – chris
:あなたは、ラムダを使用することができます。たとえば:
std::vector<int> nums{3, 4, 2, 9, 15, 267};
std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });
実際にranged-forを使用するとよい解決策はありません。 – chris
あなたはすでに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::copy
のstd::ostream_iterator
を宛先としてはるかに優れています。
これは私が探していた答えです。 'transform'は' for_each'よりPythonの 'map'に近いです。' map'は出力のリストを生成するのに対し、 'for_each'は関数を呼び出しますが出力を破棄します。 –
- 1. すべての子の特定の関数呼び出しでparent関数を呼び出すC++
- 2. Clojure:ベクトルで各要素の関数を呼び出す
- 3. 要素を渡して、onclickから関数を呼び出す
- 4. 作成する要素の関数を呼び出す
- 5. リストのすべての子要素を呼び出す
- 6. 要素なしのjavascript関数を呼び出す
- 7. <a>要素onclickイベントのJavascript関数を呼び出す
- 8. DOM要素の組み込み関数を呼び出す
- 9. を呼び出し、WebRequestクラスのすべての要素
- 10. 別の関数呼び出しで関数を呼び出す
- 11. C++の関数を呼び出す
- 12. C#のlibyahoo2関数を呼び出す
- 13. C#ですべてのフォームロードで関数を呼び出す方法は?
- 14. CでVOID関数を呼び出す
- 15. リストの要素をrの中のxの関数として呼び出す
- 16. クラス内の関数を呼び出してリストの要素を設定する
- 17. C関数呼び出し
- 18. Pythonはリスト内のすべての要素に対して再帰関数を呼び出します
- 19. すべての子コンポーネントの関数を呼び出す
- 20. 同じクラス名を持つすべての要素に対してjavascript関数を呼び出す方法
- 21. 他の割り込みベクタ内の割り込みベクタを呼び出す
- 22. HTMLハイパーリンクを使用して親要素のJS関数を呼び出す
- 23. 呼び出しLuaの関数(必要 'NN' で)C++
- 24. superClassからすべてのサブクラスを呼び出す関数
- 25. d3は、それぞれの要素を呼び出す関数です。
- 26. 関数呼び出しは要素が消えます
- 27. Polymer:要素のプロパティ値でビヘイビアのプロパティ関数を呼び出しますか?
- 28. cプログラム呼び出し関数の呼び出し
- 29. C#.NETコードのポインタでC関数を呼び出す
- 30. cライブラリのコールバック関数でC++オブジェクトを呼び出す
(ループとは対照的に)これを使用することで速度の向上が期待できますか? – dbliss
@dblissの場合、 'for_each()'の実装はまったく同じループであり、テンプレートを使用するので違いはありません。しかし、C++ 17では、並列性が導入される可能性があります。これは完全に透過的であり、より早く始めることができます。 –