このページはC++のSTL、特にalgorithmやfunctionalやiterato等のヘッダを使って幸せになるためのものです。
上記のSTLの入門にも適しているように書きたいと思います。
STLを使うと嬉しいこと
TODO
サンプルコードで覚えるSTL
一つ一つ機能を見ていくのもいいのですが、実際にサンプルコードを見たほうが理解が早まります(個人的に見ているととても楽しいです)。
stringstream ss("0 1 2 3 4");
vector<int> v((istream_iterator<int>(ss)), istream_iterator<int>());
copy(v.begin(), v.end(), ostream_iterator<int>(cout, ", ")); cout << endl;
transform(v.begin(), v.end(), v.begin(), bind2nd(multiplies<int>(), 2));
- vectorの要素を別のvectorにコピー(algorithmとiteratorを用いて)
vector<int> w;
copy(v.begin(), v.end(), back_inserter(w)); // first way
copy(v.begin(), v.end(), insert_iterator<vector<int> >(w, w.end())); // second way
transform(v.begin(), v.end(), ostream_iterator<int>(cout, ", "), bind2nd(modulus<int>(), 3)); cout << endl;
- vectorの中で3で割り切れる値を持つ要素を消去
v.erase(remove_if(v.begin(), v.end(), not1(bind2nd(modulus<int>(), 3))), v.end());
ファンクタ一覧表
STLを使っていると、頻繁にファンクタをバインドしてアルゴリズムに渡すというコードを書きます。あらかじめ定義されている以下のファンクタを覚えてしまえば、ほとんど全てのことができるので覚えてしまいましょう。名前は割と覚えやすくなっているので、すぐ覚えられると想います。
#include <functional>
#include <cassert>
using namespace std;
int main() {
int a = 5, b = 2;
assert(a + b == plus<int>()(a, b));
assert(a - b == minus<int>()(a, b));
assert(a * b == multiplies<int>()(a, b));
assert(a / b == divides<int>()(a, b));
assert(a % b == modulus<int>()(a, b));
assert(-a == negate<int>()(a));
assert((a == b) == equal_to<int>()(a, b));
assert((a != b) == not_equal_to<int>()(a, b));
assert((a > b) == greater<int>()(a, b));
assert((a >= b) == greater_equal<int>()(a, b));
assert((a < b) == less<int>()(a, b));
assert((a <= b) == less_equal<int>()(a, b));
assert((a && b) == logical_and<int>()(a, b));
assert((a || b) == logical_or<int>()(a, b));
assert(!a == logical_not<int>()(a));
return 0;
}
つづく
参考
最終更新:2013年11月28日 16:01