c++ - 如何在 std::vector 中存储对象而不复制或 move 构造函数?

标签 c++ c++11 vector constructor move

提高std::vector<T>的效率,它的底层数组需要预先分配,有时需要重新分配。然而,这需要创建和稍后 move 类型为 T 的对象。使用复制 ctor 或 move ctor。

我遇到的问题是 T无法复制或 move ,因为它包含无法复制或 move 的对象(例如 atomicmutex )。 (而且,是的,我正在实现一个简单的线程池。)

我想避免使用指针,因为:

  1. 我不需要间接级别,所以我不想要。
  2. (指针效率较低并增加了复杂性。使用指针会增加内存碎片并减少数据局部性,这可能(但不一定必须)导致明显的性能影响。不是那么重要,但仍然值得考虑。)

有没有办法避免这里的间接级别?

更新:我根据评论和答案中的反馈修正了一些不正确的假设并重新表述了问题。

最佳答案

首先,std::mutex无法复制或 move ,因此您不得不使用某种间接方式。

由于您想将互斥体存储在 vector 中,而不是复制它,我会使用 std::unique_ptr .

vector<unique_ptr<T>> does not allow certain vector operations (such as for_each)

我不确定我是否理解那句话。完全有可能做范围:

std::vector< std::unique_ptr< int > > v;
// fill in the vector
for ( auto & it : v )
  std::cout << *it << std::endl;

或使用标准算法:

#include <iostream>
#include <typeinfo>
#include <vector>
#include <memory>
#include <algorithm>


int main()
{
    std::vector< std::unique_ptr< int > > v;
    v.emplace_back( new int( 3 ) );
    v.emplace_back( new int( 5 ) );
    std::for_each( v.begin(), v.end(), []( const std::unique_ptr< int > & it ){ std::cout << *it << std::endl; } );
}

关于c++ - 如何在 std::vector 中存储对象而不复制或 move 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20487801/

相关文章:

c++ - 物体 Material 错误

C++ vector 元组,按索引从元素创建元组

c++ - vector.back() 的意外值

c++ - 从不在 PIMPL 中提供析构函数(使用 boost scoped_ptr),g++(4.6.1) 不会生成编译错误,为什么?

c++ - 为什么函数声明在 C++ 中可以有 const 参数?

c++ - Visual C++ 2010 是否支持 C++11 线程库?

c++ - C++ 中字符串中的 NUL 字符

c++ - vector push_back 和析构函数(?): push_back(~Dword(0))

r - 预先计算长度未知的向量 - 我应该 "grow"吗?

c++ - 有没有办法通过 LEMON Graph 库中的 Map 值获取节点?