アットウィキロゴ

C++のSTLが大好きになるまとめ

このページは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>());
  • vectorの全要素を表示
copy(v.begin(), v.end(), ostream_iterator<int>(cout, ", ")); cout << endl;
  • vectorの全要素を2倍
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
  • vectorの各要素を3で割った余りを表示
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