首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
如何将没有复制或移动构造函数的对象放入vector容器 ...
返回列表
发新帖
如何将没有复制或移动构造函数的对象放入vector容器
[复制链接]
发表于 2023-11-3 16:17:46
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
正文
直接说答案,这个问题无法实现。原因是因为std::vector
容器
的插入一定会调用类对象的构造函数或者移动构造函数。
说一下为什么会有这个问题,因为不想用指针,我想直接通过类对象本身的RAII机制来实现的资源的控制,智能指针是一个解决方案,不过智能指针是写起来很繁琐,终究比不上值类型方便。不过值类型要用好还是很麻烦的,比如这里的将没有复制或移动构造函数的对象插入到std::vector
容器
中的问题。
经过查阅资料,总共有四种解决方案:
使用默认构造函数,并且初始化时确定
容器
大小。例如:
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。
参考
How to store objects without copy or move constructor in std::vector?
https://zhuanlan.zhihu.com/p/364408441
回复
使用道具
举报
返回列表
浏览过的版块
Oracle
DevOps与敏捷开发
SAAS
网络安全
人工智能
公有云
前端开发
物联网
运维.售后
梦见你的名字
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表