转换的std ::指针列表快捷的方式为std ::值列表(Fast way to convert s

2019-09-19 02:41发布

我有一个std::list<obj*>这里obj是我的课:

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

我想这个列表转换为等值std::list<obj>在那之后我不再需要list_of_ptr

什么是做这项工作的最快方法?

Answer 1:

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个lambda表达式,可以使用一个简单的函数对象来执行间接:

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()));

这些,当然,假设有序列中的空指针。 它作为一个练习,为读者找出如何正确管理对象的生命周期由指针指向list_of_ptr

理想情况下,一个将使用std::vector<obj>从一开始,或者,如果这是不可能的,智能指针的容器。 手动管理的寿命指向的对象,所以在做正确,是非常困难的。 C ++有真棒自动对象的生命周期管理设施(析构函数,智能指针,容器,堆语义,RAII),并且没有理由不使用它们。



Answer 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);
});


文章来源: Fast way to convert std::list of pointer to std::list of value