3

私は、私のクラスはstd::list<obj*>どこにありますか:obj

std::list<obj*> list_of_ptr;
list_of_ptr.push_back(new obj());

このリストを同等のものに変換したいのですがstd::list<obj>、その後はもう必要ありませんlist_of_ptr

この作業を行うための最速の方法は何ですか?

4

2 に答える 2

5

std::transformあなたの友だちです:

std::vector<obj> objects;
std::transform(
    list_of_ptr.begin(), list_of_ptr.end(),
    std::back_inserter(objects), 
    [](obj* p) { return *p; });

または、C ++ 11ラムダ式を使用できない場合は、単純な関数オブジェクトを使用して間接参照を実行できます。

struct indirect
{
    template <typename T>
    T& operator()(T* p) { return *p; }
};

std::transform(
    list_of_ptr.begin(), list_of_ptr.end(),
    std::back_inserter(objects), 
    indirect());

または、を使用してboost::indirect_iterator

std::vector<obj> objects(
    boost::make_indirect_iterator(list_of_ptr.begin()),
    boost::make_indirect_iterator(list_of_ptr.end()));

もちろん、これらはシーケンスにnullポインタがないことを前提としています。のポインタが指すオブジェクトの存続期間を正しく管理する方法を理解するための演習として残されていますlist_of_ptr

理想的にはstd::vector<obj>、最初からを使用するか、それが不可能な場合は、スマートポインターのコンテナーを使用します。ポイントされたオブジェクトの存続期間を手動で管理し、それを正しく行うことは非常に困難です。C ++には、優れた自動オブジェクト存続期間管理機能(デストラクタ、スマートポインター、コンテナー、スタックセマンティクス、RAII)があり、それらを使用しない理由はありません。

于 2012-07-04T21:17:02.067 に答える
2

わかりやすいシンプルさとコードもあなたの友達です。

for each (obj* pObj in list_of_ptr)
{
    if (pObj != nullptr)
    {
        list_of_objects.push_back(*pObj);
    }
}

そして、それがあなたのためにコンパイルされない場合、これは確かにすべきです:

std::list<obj> list_of_objects;

for_each(list_of_ptr.begin(), list_of_ptr.end(), [&list_of_objects] (obj* pObj) {
    if (pObj != nullptr)
        list_of_objects.push_back(*pObj);
});
于 2012-07-04T21:52:06.547 に答える