前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何将没有复制或移动构造函数的对象放入vector容器

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

作者头像
charlee44
发布2023-10-22 09:12:18
1380
发布2023-10-22 09:12:18
举报
文章被收录于专栏:代码编写世界代码编写世界

正文

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

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

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

使用默认构造函数,并且初始化时确定容器大小。例如:

代码语言:javascript
复制
int num = 23;
std::vector<std::mutex> vec(num);

将std::vector容器中的元素改成智能指针std::unique_ptr。

更换容器,使用std::deque。

更换容器,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
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文
  • 参考
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com