存储指针向量的最佳 C++11 方法
best c++11 way to store a vector of pointers
我想存储 std::threads
的向量
目前,我将其实现为 std::vector<std::thread*>
但是,这需要手动删除 std::thread
s
执行此操作的最优雅的 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
可能是最好的选择;或像 deque
或 list
这样不需要移动其值的容器。
我想存储 std::threads
目前,我将其实现为 std::vector<std::thread*>
但是,这需要手动删除 std::thread
s
执行此操作的最优雅的 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
可能是最好的选择;或像 deque
或 list
这样不需要移动其值的容器。