読者です 読者をやめる 読者になる 読者になる

Folioscope

プログラミング/Unix系/デザイン/CG などのメモがもりもり

コンテナのコンテナのforeach

BoostにはBOOST_FOREACHマクロがあり,他の言語でのforeachが気軽に書ける. しかしstd::list<std::pair<T1, T2> >などの,コンテナのコンテナを扱うときには少し気を使う必要がある

std::list<std::pair<int, float> > list_of_pair;
BOOST_FOREACH (const std::pair<int, float> &pair, list_of_pair) {
}

やりたいとこは伝わるが,コンパイルエラー. コンマが2つあるので.マクロに3つの引数と解釈される.

部分点がもらえる正解

コンパイルは通り,希望通りの動作はするが,pairのコピーにムダなオーバーヘッドが発生する. これではC++の哲学に反する.

std::pair<int, float> pair;
BOOST_FOREACH (pair, list_of_pair) {
}

合格点がもらえる正解

typedefを使ってPairを宣言する方法. おそらくこれが正解.

typedef std::pair<int, float> Pair;
BOOST_FOREACH (const Pair &pair, list_of_pair) {
}

新しいもの好きな人向け

C++11からrange-based forが使えるので,一番綺麗に書くことができる.C++11ユーザは素直にこっちを書きましょう.

for (const std::pair<int, float> &pair : list_of_pair) {
}