2013年2月10日日曜日

STLのfor_each

お題: std::vector<std::list<int> > の,std::list<int> の要素を全て削除する.

std::for_each() を使えばよろしい,と思った.

以下,ダメな例:
#include <algorithm>
#include <list>
#include <vector>

void clear(std::list<int> l)
{
  l.clear();
}

int main(int argc, char **argv)
{
  std::vector<std::list<int> > data;

  /* snip */

  std::for_each(data.begin(), data.end(), clear);

  /* snip */

  return 0;
}
以下,動く例:
#include <algorithm>
#include <list>
#include <vector>

void clear(std::list<int> &l)
{
  l.clear();
}

int main(int argc, char **argv)
{
  std::vector<std::list<int> > data;

  /* snip */

  std::for_each(data.begin(), data.end(), clear);

  /* snip */

  return 0;
}
どこが違うか? for_eachの引数として与える関数の引数を参照渡しにするかどうか,だけ.しかも,宣言部のみ.また値渡しの方は,全要素コピーが発生している? 気をつけよう.

追記: しかしながら,メンバ関数をfor_eachの第3引数にする場合は,bind1st と mem_ref を使うのが定石らしく,かつ,参照呼び出しは,boostまで導入せねばならないようだ.読んだだけで未確認.
http://hippos-lab.com/blog/node/319
そこまでせなあかんのやったら,もう明示的にループまわすわ...

0 件のコメント:

コメントを投稿