存储指针向量的最佳 C++11 方法

best c++11 way to store a vector of pointers

我想存储 std::threads

的向量

目前,我将其实现为 std::vector<std::thread*> 但是,这需要手动删除 std::threads

执行此操作的最优雅的 c++11 方法是什么?我可以看到 std::shared_ptr,但这不是矫枉过正吗?指针是唯一的,但是std::vector需要临时复制。

也许我不需要指点,但是 std::thread 因为不可复制,我想我需要。

谢谢!

Yoy 可以使用 std::vector<std::thread>emplace_back:

threads.emplace_back([](int i){ ++i; }, 10);

emplace_back 使用完美转发将其参数直接传递给 std::thread 构造函数,并将新对象放入 vector 内存中,例如:

new (vector_ptr + offset) std::thread(args...);

它只涉及 moving - 一种新的处理对象的语义,它可以替代 copying 并且在资源使用方面可能更便宜. std::thread支持移动

如果您的编译器支持 c++11,则使用 std::unique_ptr,如果您的编译器不支持,则使用 boost::shared_ptr。

不,这不是矫枉过正 -- 这是很好的编程。

从 C++11 开始,vector 只要求它的值是可移动的,就像 thread 一样。所以vector<thread>应该能满足你的需求。

对于不可复制类型的操作有一些限制 - 您不能将值复制入或复制出,只能移动或放置它们 - 但这些很容易适应。

如果您确实需要存储不可移动的类型(例如mutex),那么unique_ptr可能是最好的选择;或像 dequelist 这样不需要移动其值的容器。