首页 > 其他分享 >如何将没有复制或移动构造函数的对象放入vector容器

如何将没有复制或移动构造函数的对象放入vector容器

时间:2023-10-16 21:35:30浏览次数:36  
标签:std 容器 deque vector 构造函数 指针

正文

直接说答案,这个问题无法实现。原因是因为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

标签:std,容器,deque,vector,构造函数,指针
From: https://www.cnblogs.com/charlee44/p/17768402.html

相关文章

  • docker容器部署jenkins
    1.下载镜像dockerpulljenkins/jenkins2.创建用户和数据目录并授权useradd-u1000jenkins-M-s/sbin/nologinmkdir/data/jenkins/-pchown-Rjenkins:jenkins/data/jenkins/3.运行镜像dockerrun\--namejenkins\-p8080:8080-p50000:50000\--privilege......
  • 了解容器运行时安全:保护你的容器应用
    前言容器是一种虚拟化技术,用于封装和运行应用程序及其依赖项,以便在不同的计算环境中保持一致性和可移植性。自2013年容器诞生至今,容器Docker镜像的下载量超20亿,虽然容器行业发展如火如荼,但是其安全风险却不容乐观,据《Sysdig2022云原生安全和使用报告》显示,超过75%的运行容器存在......
  • BOSHIDA DC电源模块关于电容器的电解液位置
    BOSHIDADC电源模块关于电容器的电解液位置DC电源模块中的电容器扮演着一个非常重要的角色,它们能够对电路提供稳定的电源电压,同时也可以作为电路中的滤波器,去除电路中的噪声和纹波。在DC电源模块中使用的电容器通常是电解型电容器,而这些电解型电容器中的电解液位置是一个非常关键......
  • 部署 Docker 容器
    一.基于centos的rpm方式部署docker1)添加docker的软件源[root@docker~]#curl-s-o/etc/yum.repos.d/docker-ce.repohttps://download.docker.com/linux/centos/docker-ce.repo2)查看现有的docker版本[root@docker~]#yumlistdocker-ce--showduplicates|sort......
  • UE4 VectorParameter float3 nor float
    问题在UE4.27的版本中,VectorParameter的类型是float3而不是float4,这就导致在实例化函数时会少一个float,十分麻烦解决运用"append"即可referencehttps://forums.unrealengine.com/t/vectorparameter-incorrectly-converted-to-materialfloat3-in-custom-node/334226/6......
  • string类构造函数与析构函数
    string类构造函数与析构函数构造函数构造函数作用strings构造一个空字符串strings(s1)生成一个和s1相同的空字符串sstrings(s1,5)将s1[5]以后的部分作为s的初始部分strings(s1,5,5)将始于s1[5],长度为5的部分作为s的初始值strings(cstr)以C_strin......
  • 向量vector
    向量vector1.几种向量的定义方式(1)vector<int>vec创建一个类型为int的空vector(2)vector<int>vec(vec2)复制创建一个和vec2数据完全相同的vec(3)vector<int>vec=vec2;(4)vector<int>vec(n,val)创建一个包含有n个数据,值为val的元素(5)vector<int>vec(n)......
  • Test class should have exactly one public zero-argument constructor(测试类应该只
    在练习重写equals方法时写测试方法遇到这个问题先放报错代码:publicclassOrder{intorderId;StringorderName;publicintgetOrderId(){returnorderId;}publicvoidsetOrderId(intorderId){this.orderId=orderId;}......
  • 博学谷学习记录 自我总结 用心分享 | Docker容器化
    前言容器技术、虚拟化技术已经成为一种被大家广泛认可的服务器资源共享方式,容器技术可以在按需构建操作系统实例的过程当中为系统管理员提供极大的灵活性。由于hypervisor虚拟化技术仍然存在一些性能和资源使用效率方面的问题,因此容器技术(Container)结合虚拟化技术的解决方案正在......
  • Vector多行日志读取,解析
    官方记录:https://github.com/vectordotdev/vector/issues/2137目前只支持file、docker[sources.multiline_logs]type="file"include=["/opt/multiline.log"] [sources.multiline_logs.multiline] start_pattern='^<\d+>' mode=......