unique_ptrのベクトルを持っているので、これらの要素はに移動することができます。つまり、サブセットを取得すると元のベクトルはもう同じになりません。
少なくとも破壊的方法は、同じベクター内のすべてを維持しながら、二つのグループにベクターを分割するstd::stable_partition
を使用することである。
auto sep = std::stable_partition(vec.begin(), vec.end(), [](const auto& foo) {
return foo->is_good();
});
// the part `vec.begin() .. sep` contains all "good" foos.
// the part `sep .. vec.end()` contains all "bad" foos.
順序が重要でない場合、use std::partition
instead。使い方は同じです。
悪いfoosを別のベクトルに分割する場合は、std::copy_if
+ std::make_move_iterator
を使用してオブジェクトを移動することができます。これはどこにでも穴が残ることに注意してください。それらをクリーニングするにはstd::remove
を使用してください。
decltype(vec) bad_vec;
std::copy_if(std::make_move_iterator(vec.begin()),
std::make_move_iterator(vec.end()),
std::back_inserter(bad_vec),
[](const auto& p) { return !p->is_good(); });
auto new_end = std::remove(vec.begin(), vec.end(), nullptr);
vec.erase(new_end, vec.end());
あなたは、もはや、「悪い」のオブジェクトを気にしないstd::remove_if
を使用する場合:あなたは、可能性が
auto new_end = std::remove_if(vec.begin(), vec.end(), [](const auto& foo) {
return !foo->is_good();
});
vec.erase(new_end, vec.end());
// now `vec` only contains "good" foos.
あなただけの生のポインタ、代わりのunique_ptrを自分自身を取得したい場合std::transform
を使用してvector<Foo*>
を入力してからremove_if
をフィルタリングしてください...しかし、この時点ではおそらくforループを書く方が簡単でしょう。
std::vector<int*> good_vec;
for (const auto& foo : vec) {
if (foo->is_good()) {
good_vec.push_back(foo.get());
}
}
'std :: copy_if 'は要件を満たしていますか? http://en.cppreference.com/w/cpp/algorithm/copy –
返されるサブセットのタイプをどのようにしたいですか?そして元のベクトルは変更されるかどうかですか?あなたは本当にあなたの問題をより正確に指定する必要があります。 –
サブセットをFooポインタのベクトルにしたい。私はオリジナルのベクトルに影響を与えたくありません。サブセットベクトルのアイテムを編集し、それらの編集を元のベクトルに反映させたいと思います。私はポインターを使用していることが確実であると想定しています。 – Craig