gpt4 book ai didi

C++11 STL 容器,支持只移动类型并且对开始和结束具有 O(1) 写访问权限

转载 作者:行者123 更新时间:2023-11-27 23:58:14 25 4
gpt4 key购买 nike

我正在开发一个应用程序,我需要在其中排队一些仅移动类型并且我需要快速写入-访问 容器的开始结束(主要是快速添加元素)。

乍一看我想用std::deque<T>但它需要 T是可复制构造的,所以它不会完成这项工作。

我现在正在考虑std::vector , 但我担心将元素添加到 vector 的开头会因为重新分配所有的东西真的很慢。

对这种容器有什么建议吗?

关于我需要的操作的注意事项(在 std::deque 上):

  • emplace_back
  • emplace_front
  • pop_front
  • empty
  • front

这些是当前使用的操作(我的实现现在使用 std::shared_ptr 使只能移动的类型可复制)

我需要排队的确切类型是 std::function<void()> 的仅移动版本.如果我尝试使用 std::deque 的移动版本我收到以下编译器错误 (clang++):

error: use of deleted function ‘std::packaged_task<_Res(_ArgTypes ...)>::packaged_task(const std::packaged_task<_Res(_ArgTypes ...)>&) [with _Res = void; _ArgTypes = {}]’ In file included from /home/superuser/Desktop/thread_pool/thread_pool.hpp:32:0, from /home/superuser/Desktop/thread_pool/test.cpp:1: /usr/include/c++/6/future:1513:7: note: declared here packaged_task(const packaged_task&) = delete;

请注意,您会看到 std::packaged_task , 因为它被移动到由 std::function<void()> 包裹的 lambda 中.

最佳答案

这是 [MCVE] 为何如此有用的经典示例。

std::function<void()> fun = std::move(queue.front());

以上内容不会在 queue 中使用不可复制的内容进行编译.但是 queue工作正常。 std::deque解决您的问题。

std::function要求其内容是可复制的。即使你从不移动它,它也要求它是可复制的。 std::function使用类型删除,因此当您在其中存储内容时,“如何复制”内容也会被存储。

Here是一个只能移动的std::function这并没有做我两年前在 SO 上写的小缓冲区优化。

今天我会用不同的方式来写。我会将类型删除从存储中分离出来,并编写一个单独的 SBO 存储类型,然后将它们连接在一起写入 task<Sig> .

有趣的是,packaged_task<void(Args...)>packaged_task<R(Args...)> 的类型删除 SBO 只移动包装器.但它的作用更多,所以我会避免使用它。

现在,std 容器关于其内容要求的规则有所不同,标准通常变得更加宽松。有一次,即使没有使用,也有一堆要求放在类型上;当前标准规定这些要求是基于每个方法的。许多编译器在标准移动之前强制执行了那些更宽松的要求(因为几乎不需要严格,标准没有要求它),所以即使在自由化之前的编译器中也不是问题。我不确定这种自由化是否发生在 std::deque是否通过 C++11;然而,这是“如果它在您的编译器中有效,请使用它,因为 future 的编译器将支持它”的示例。

关于C++11 STL 容器,支持只移动类型并且对开始和结束具有 O(1) 写访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40999544/

25 4 0
文章推荐: javascript - 如何使用单选按钮输入值将表单输入填充到重定向的网页中
文章推荐: jquery - 在输入框中禁用一些 html 输出
文章推荐: css - Wordpress 网站不响应媒体查询的背景变化? Divi 主题
文章推荐: css - 备用
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com