我有一个std::list<obj*>
,obj
我的课在哪里:
std::list<obj*> list_of_ptr;
list_of_ptr.push_back(new obj());
我想将此列表转换为等效列表std::list<obj>
,之后我不再需要list_of_ptr
.
完成这项工作的最快方法是什么?
我有一个std::list<obj*>
,obj
我的课在哪里:
std::list<obj*> list_of_ptr;
list_of_ptr.push_back(new obj());
我想将此列表转换为等效列表std::list<obj>
,之后我不再需要list_of_ptr
.
完成这项工作的最快方法是什么?
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>
从一开始就使用 a ,或者,如果不可能,则使用智能指针容器。手动管理指向对象的生命周期并正确执行是非常困难的。C++ 有很棒的自动对象生命周期管理工具(析构函数、智能指针、容器、堆栈语义、RAII),没有理由不使用它们。
简单易懂的代码也是你的朋友:
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);
});