正文

直接说答案,这个问题无法实现。原因是因为std::vector容器的插入一定会调用类对象的构造函数或者移动构造函数。

说一下为什么会有这个问题,因为不想用指针,我想直接通过类对象本身的RAII机制来实现的资源的控制,智能指针是一个解决方案,不过智能指针是写起来很繁琐,终究比不上值类型方便。不过值类型要用好还是很麻烦的,比如这里的将没有复制或移动构造函数的对象插入到std::vector容器中的问题。

经过查阅资料,总共有四种解决方案:

  1. 使用默认构造函数,并且初始化时确定容器大小。例如:
    int num = 23;
    std::vector<std::mutex> vec(num);
  2. 将std::vector容器中的元素改成智能指针std::unique_ptr。
  3. 更换容器,使用std::deque。
  4. 更换容器,std::list/forward_list。

第一种方案比较有局限性,不仅要求使用默认参数,还要求预先确定容器大小。使用智能指针的方案还是不错的,只要你愿意使用智能指针的语法。笔者这里使用的时第三种,更换容器为std::deque。

std::deque是双端队列,和std::vector相比,其内存存储不是连续的,但是也不像std::list是那种完全碎片化的内存,是一小块连续空间连着一小块连续空间进行存储的。因此,在插入时std::deque不像std::vector那样需要移动或者拷贝构造,是直接初始化构造在分配的空间中的。

基于这个原理,std::deque的随机访问、在尾部和首部插入和删除的速度都很快,时间复杂度都为O(1)。如果不是有特别的需求,可以使用std::deque代替std::vector。

参考

  1. How to store objects without copy or move constructor in std::vector?
  2. https://zhuanlan.zhihu.com/p/364408441

如何将没有复制或移动构造函数的对象放入vector容器的更多相关文章

  1. 《挑战30天C++入门极限》C++类对象的复制-拷贝构造函数

        C++类对象的复制-拷贝构造函数 在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int ...

  2. Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)

    反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...

  3. C++ 构造函数的对象初始化列表

    //构造函数的对象初始化列表 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class P ...

  4. OOP3(继承中的类作用域/构造函数与拷贝控制/继承与容器)

    当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的 ...

  5. 前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述

    前言 作为一名资深搬砖工,你要问我用得最熟练的技能是什么,那我敢肯定且自豪的告诉你:是 Ctrl+C !是 Ctrl+V! 不信?你来看看我键盘上的 Ctrl.C 和 V 键,那油光发亮的包浆程度,不 ...

  6. js系列教程2-对象、构造函数、对象属性全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  7. Vector容器构造函数

    No1 vector(); No2 vector( const vector& c ); No3 explicit vector( size_type num, const TYPE& ...

  8. JS构造函数、对象工厂、原型模式

    1.对象创建的3中方法 1.1.对象字面量 var obj = { name: "mingzi", work: function () { console.log("wo ...

  9. 分析 js构造函数:对象方法 、类方法 、原型方法

    构造函数方法有对象方法.类方法.原型方法,这些方法在什么时候可以调用,什么时候不能调用,为什么? function Func(name){ this.name=name; this.ff=functi ...

  10. 2.10 C++利用构造函数限制对象的创建

    参考: http://www.weixueyuan.net/view/6342.html 总结: 限制对象的创建.限制创建对象时能够按照我们需要的那样创建,而不能随意的创建对象. 类中显示地声明了任意 ...

随机推荐

  1. Elasticsearch 6.8.6

    mac;centos;unix;  下载 wget  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.6. ...

  2. MySQL PXC集群新增一个高版本节点

    已有的一个 MySQL PXC 集群环境,因为种种原因仅剩一个节点 node1,需要新增一个集群节点 node2. node1 版本:donor version (8.0.21) node2 版本:l ...

  3. ida反汇编失败

    options->general->打开堆栈指针(stack pointer) 可见反汇编失败提示的地址(本程序为00101481,原本此处不为000)处堆栈指针不为0,因此需要修改 al ...

  4. mysql之简单的多表查询

    最简单的多表查询需要用到连操作符(join) 1.笛卡儿积 形式为table1 join table2.如: select e.fname,e.lname,d.name from employee e ...

  5. keycloak~为keycloak-services项目添加第三方模块(首创)

    我们在对keycloak框架中的核心项目keycloak-services进行二次开发过程中,发现了一个问题,当时有这种需求,在keycloak-services中需要使用infinispan缓存,我 ...

  6. HTML5学习内容-3

    (一)行高 line-height,一行文字的高度 例子 <!DOCTYPE html> <html lang="en"> <head> < ...

  7. Nebula Graph开源分布式图数据库,万亿级数据,毫秒级延时

    推荐一个分布式图数据库Nebula Graph,万亿级数据,毫秒级延时 什么是Nebula Graph Nebula Graph 是一款开源的.分布式的.易扩展的原生图数据库,能够承载包含数千亿个点和 ...

  8. 一篇文章带你了解Python基础测试工具——UnitTest

    一篇文章带你了解Python基础测试工具--UnitTest 测试人员一般使用Python作为主语言脚本来进行自动化开发,而Python自带的UnitTest脚本通常就是测试人员首先掌握的 那么本篇文 ...

  9. 本地Stackedit Markdown编辑器设置远程访问

    StackEdit是一个受欢迎的Markdown编辑器,在GitHub上拥有20.7k Star!,它支持将Markdown笔记保存到多个仓库,包括Gitee.GitHub和Gitea.此在线笔记工具 ...

  10. 有什么BI工具可以实现中国式报表?

    BI(Business Intelligence)工具是指用于帮助企业收集.分析.处理和展示数据的软件工具,以支持企业决策制定和业务运营优化的技术系统. 中国式报表在BI工具中的实现主要涉及到对中国商 ...