お題: 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
そこまでせなあかんのやったら,もう明示的にループまわすわ...