集合セット S に foo クラスが入っており、集合セット S は生成と破棄を行います。
集合セット S に含まれる foo は、それぞれ異なりますが、重複する場合があります。
foo を shared_ptr でラップして、集合セットに保持し、全体としての foo のカタログを weak_ptr で持たそうかなぁ?とも思いましたが、カタログにアクセスする度に weak_ptr::lock を呼び出すのも非効率的です。何よりも、foo オブジェクトを探したいのに死んでいたら foo オブジェクトの値を取り出せないので、lower_bound とかで検索できないのも痛いです。
という事で、shared_ptr::use_count を調べて、カタログ以外に所有者がいなければ、消せばええやん!という風にしましたが、うまく行きませんでした。以下のコードです。
#include <iostream> #include <vector> #include <boost/shared_ptr.hpp> #include <boost/range/algorithm_ext/erase.hpp> struct foo { }; typedef boost::shared_ptr<foo> foo_t; int main() { std::vector<foo_t> v; for( int i = 0; i < 10; ++i ) v.push_back( foo_t( new foo ) ); std::cout << "=== run remove_erase_if" << std::endl; boost::remove_erase_if( v, [](foo_t val) -> bool { std::cout << val.use_count() << std::endl; return val.use_count() <= 1; } ); std::cout << "erased -> " << v.size() << std::endl; return 0; }はい、正解は、
[](foo_t& val) -> bool {参照でアクセスしないと、カウント増えますよねwwwwwって事でした。
0 件のコメント:
コメントを投稿