【问题标题】:Fast way to convert std::list of pointer to std::list of value将指针的 std::list 转换为 std::list 的快速方法
【发布时间】:2012-07-04 21:06:01
【问题描述】:

我有一个std::list<obj*>,其中obj 是我的班级:

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

我想将此列表转换为等效的std::list&lt;obj&gt;,之后我不再需要list_of_ptr

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

【问题讨论】:

  • 为什么首先要有一个拥有指针的容器?首选的解决方案是从一开始就使用obj 的容器。你用什么标准来选择std::list
  • @JamesMcNellis 你是对的,但我现在无法更改。
  • 除非不可能更改代码(例如,它是其他软件组件所依赖的接口的一部分,因此无法更改),否则要简单得多使用自动生命周期管理(即避免显式的newdelete)重写代码,而不是尝试使您的手动内存管理正确。
  • @JamesMcNellis This 是问题所在。
  • 像这样在容器中存储指针几乎总是不必要的,而且是个坏主意。让容器为你管理你的对象,这是它的强项。

标签: c++ stl containers


【解决方案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&lt;obj&gt;,或者,如果不可能,则使用智能指针容器。手动管理指向对象的生命周期并正确执行是非常困难的。 C++ 有很棒的自动对象生命周期管理工具(析构函数、智能指针、容器、堆栈语义、RAII),没有理由不使用它们。

【讨论】:

    【解决方案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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2011-03-10
      • 2011-03-18
      • 2021-02-24
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      相关资源
      最近更新 更多