C 11 STL容器支持仅移动类型,并且具有O(1)写入访问的开始和结束



我正在开发一个应用程序,我需要 queue UP 一些仅移动类型,我需要 fast 写入 - 访问 to 开始和容器的 END (主要是快速添加元素)。/p>

乍一看,我想使用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 ):

错误:使用已删除函数'std :: packaged_task&lt; _ res(_argtypes) ...)> :: packaged_task(const std :: packaged_task&lt; _res(_argtypes ...)>&amp;) [带有_res = void;_argtypes = {}]'包含在文件中 /home/superuser/desktop/thread_pool/thread_pool.hpp:32:0, 来自/home/superuser/desktop/thread_pool/test.cpp:1:/usr/ussr/include/c /6/future:1513:7:注意:注意:在此处声明 packaged_task(const packaged_task&amp;)= 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使用类型擦除,因此在将内容存储在其中时"如何复制"内容。

这是一个仅动作的std::function,它不做我两年前写的小型缓冲区优化。

今天我会以不同的方式写。我会将类型的擦除从存储中分开,然后编写单独的SBO存储类型,然后将它们加在一起编写task<Sig>

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

现在,关于其内容需求的STD容器的规则已经有所不同,标准经常变得更加自由。在某一时刻,即使没有使用类型,也有一堆要求。当前的标准指出,这些要求是按人均为基础的。许多编译器在标准搬迁之前强行了这些更加自由的要求(因为几乎不需要严格,标准并不要求它),因此,即使在自由化之前的编译器中,也不是问题。我不确定这种自由化是否通过C 11在std::deque中发生。但是,这就是一个示例:"如果它在编译器中使用,请使用它,因为将来的编译器将支持它"。

相关内容

最新更新