ネタ元 → 構造体を検索
「コンテナ内から特定の条件を満たす要素を列挙せよ」ってことらしい。
現標準C++ライブラリでは、コレを直接的にやってくれるアルゴリズムがありません。
remove_copy_if( first, last, out, pred)
シーケンス [first,last) 内の各要素 x に対し、pred(x) がtrueでない x を out にコピーする。
ってのはあるんですわ。これを使うと条件 pred をひっくり返さにゃなりません。
C++0x では新たに copy_if が追加されそう。
これがあれば
// 所望する条件を満たせばtrueを返す関数
bool age5(const AAA& a) {
return a.age == 5;
}
void main() {
vector<AAA> a;
AAA b;
b.age = 1; b.name = "みづき"; a.push_back(b);
b.age = 5; b.name = "シュウたん"; a.push_back(b);
b.age = 5; b.name = "マグさん"; a.push_back(b);
for ( vector<AAA>::iterator position = a.begin();
(position = find_if(position, a.end(), &age5)) != a.end();
++position ) {
cout << *position << endl;
}
}
とか
// 所望する条件を満たせばtrueを返さない関数
bool notage5(const AAA& a) {
return a.age != 5;
}
void main() {
...
remove_copy_if(a.begin(), a.end(), ostream_iterator<AAA>(cout,"\n"), ¬age5);
}
なんて現状の居心地のよくない実装がかなり素直↓になります。
// 所望する条件を満たせばtrueを返す関数
bool age5(const AAA& a) {
return a.age == 5;
}
void main() {
...
copy_if(a.begin(), a.end(), ostream_iterator<AAA>(cout,"\n"), &age5);
}
こうでなくちゃー♪