如何将没有复制或移动构造函数的对象放入vector容器
正文
直接说答案,这个问题无法实现。原因是因为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
如何将没有复制或移动构造函数的对象放入vector容器的更多相关文章
- 《挑战30天C++入门极限》C++类对象的复制-拷贝构造函数
C++类对象的复制-拷贝构造函数 在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int ...
- Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...
- C++ 构造函数的对象初始化列表
//构造函数的对象初始化列表 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class P ...
- OOP3(继承中的类作用域/构造函数与拷贝控制/继承与容器)
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的 ...
- 前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述
前言 作为一名资深搬砖工,你要问我用得最熟练的技能是什么,那我敢肯定且自豪的告诉你:是 Ctrl+C !是 Ctrl+V! 不信?你来看看我键盘上的 Ctrl.C 和 V 键,那油光发亮的包浆程度,不 ...
- js系列教程2-对象、构造函数、对象属性全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...
- Vector容器构造函数
No1 vector(); No2 vector( const vector& c ); No3 explicit vector( size_type num, const TYPE& ...
- JS构造函数、对象工厂、原型模式
1.对象创建的3中方法 1.1.对象字面量 var obj = { name: "mingzi", work: function () { console.log("wo ...
- 分析 js构造函数:对象方法 、类方法 、原型方法
构造函数方法有对象方法.类方法.原型方法,这些方法在什么时候可以调用,什么时候不能调用,为什么? function Func(name){ this.name=name; this.ff=functi ...
- 2.10 C++利用构造函数限制对象的创建
参考: http://www.weixueyuan.net/view/6342.html 总结: 限制对象的创建.限制创建对象时能够按照我们需要的那样创建,而不能随意的创建对象. 类中显示地声明了任意 ...
随机推荐
- Python经典编程题40题(二)
Python经典编程题40题(二) 题目 给你一个list L, 如 L=[2,8,3,50], 对L进行降序排序并输出, 如样例L的结果为[50,8,3,2] 输入示例 输入:L = [4, ...
- DHCP和PXE是怎么工作的
dhcp(Dynamic Host Configuration Protocol):配置一段共享IP地址,为新上线的机器分配IP地址,回收下线机器的IP地址. 正常情况下主机(DHCP client) ...
- Regions 题解
Regions 这里提供一种时间复杂度不那么优秀但十分好写也好理解的做法. 题目大意 给定一颗 \(n\) 个节点的树,每个节点拥有一个颜色,进行若干次询问,每次询问给出两种颜色 \(A,B\),求所 ...
- 数据结构与算法 | 二叉树(Binary Tree)
二叉树(Binary Tree) 二叉树(Binary Tree)是一种树形数据结构,由节点构成,每个节点最多有两个子节点:一个左子节点和一个右子节点. public class TreeNode { ...
- LVS负载均衡概念+三种模式
1.LVS负载均衡概念剖解: 1)LVS技术全称:Linux virtual Server ,Linux虚拟机服务器集群,1998由章文嵩博士设计.并且开源的,是中国最早的开源软件项目之一. 2) ...
- Nginx-自动漂移VIP
自动漂移VIP-1 #!/bin/bash #2020-03-16 14:24 #auto change nginx vip.sh #By Precious ##################### ...
- 2022/7/26 暑期集训 pj组第6次%你赛
个人第3次 又是下午打,旁边那帮 不知好歹的 入门组小孩们又在吵吵... T1 老师是不是放反了? T1 是蓝题诶 理所应当地 跳过 然后就忘了写了,连样例也没打...样例可是有7分诶! 到现在也没写 ...
- 博弈论nim游戏
nim游戏 给定n堆物品,第i堆物品有Ai个,两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取.取走最后一件物品的人获胜. 定理:nim游戏先手必胜,当且仅当A1 xor ...
- 改变element dialog弹窗的关闭按钮样式
.el-dialog__headerbtn { top: 8px !important; background: url('https://你路径资源的url图片') left no-repeat; ...
- 6k Star!B站、滴滴、小红书都在用的网站防火墙
你有网站么?你担心网站被黑客攻击么?你知道如何抵御来自黑客的攻击吗? 据称互联网上有 30% 的流量都来自于恶意攻击.做过 Web 开发或者有过建站经验的朋友对 SQL 注入.CC 攻击.XSS.We ...