c++ std::vector对模板参数T类型的要求

码途追光人
• 阅读 5134

std::vector模板类对模板参数T的要求取决于在该容器上进行的操作,基本的,该类型要是完整类型并满足Erasable要求(所有标准库容器均要求其元素满足Erasable要求(可擦除要求))
Erasable指定该类型的对象能够以给定的分配器(Allocator)销毁。
接下来我们看下一些成员函数还有哪些更严格的要求。
首先,我们看下一些常见的更严格的要求都有哪些并分别是什么含义:

  • MoveInsertable
  • CopyInsertable
  • DefaultInsertable
  • EmplaceConstructible

其实这些就是要求分配器类型能正确的调用对应的初始化函数construct,以移动、拷贝、默认和就位构造元素。详见https://zh.cppreference.com/w...
1 emplace_back
必须满足MoveInsertable和EmplaceConstructible
2 resize(size_type count)
必须满足MoveInsertable和DefaultInsertable
3 resize(size_type count,const value_type& value)
必须满足CopyInsertable
4 push_back(const T& value)
必须满足CopyInsertable
5 push_back(T&& value)
必须满足MoveInsertable

注:2中的resize函数中,如果要求的大小比当前capacity还要大,那么需要申请新的内存,然后调用移动或拷贝构造函数将前面已经构造好的元素逐个移动或拷贝过去,这些函数的选用优先级:noexcept移动构造函数、复制构造函数、非noexcept的移动构造函数。
注:这里涉及到resize函数的异常安全性的保障,所以要求noexcept的移动构造函数。

如果你想要放在vector中的元素类型是不可复制也不可移动的(std::mutex)就很僵硬了,这意味着大部分必要的成员函数无法使用。这种情况建议加一层间接层:

std::vector<std::shared_ptr<std::mutex>> muts_;

然后在初始化vector数组时使用循环完成:

for(size_t i = 0; i<20; ++i) {
    muts_.emplace_back(new std::mutex());
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java常用类(2)
三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
cpp加油站 cpp加油站
4年前
【deque容器系列一】基于STL源码分析deque容器整体实现及内存结构
本篇文章基于gcc中stl的源码介绍deque容器的整体实现和它的内存结构。说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。首先呢,还是看一下思维导图,如下:1.deque容器整体源码实现介绍deque容器是stl中顺序容器的一种,之前已经介绍过array和vector了,今天介绍deque容器,deque的本质是一个类模板,它的
Stella981 Stella981
3年前
Spring Data Jpa最佳实践
前言SpringDataJpa框架的目标是显著减少实现各种持久性存储的数据访问层所需的样板代码量。SpringDataJpa存储库抽象中的中央接口是Repository。它需要领域实体类以及领域实体ID类型作为类型参数来进行管理。该接口主要用作标记接口,以捕获要使用的类型并帮助您发现扩展该接口的接口。CrudRepository、JpaRe
Stella981 Stella981
3年前
C++中string类的正确写法
C的一个常见面试题是让你实现一个String类,限于时间,不可能要求具备std::string的功能,但至少要求能正确管理资源。具体来说:1.能像int类型那样定义变量,并且支持赋值、复制。2.能用作函数的参数类型及返回类型。3.能用作标准库容器的元素类型,即vector/list/deque的
Stella981 Stella981
3年前
C++中vector的使用
在c中,vector是一个十分有用的容器。作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。vector在C标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类(https://www.oschina.net/action/GoToLink?url
Wesley13 Wesley13
3年前
C++:模板类
22.模板类22.1模板类模板是泛型编程的基础,那什么是泛型编程呢?泛型编程是一种独立于任何特定数据类型编写代码的方式。C标准模板库中的数据容器、迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。比如动态数组vector是可以存放任何类型数据的容器,我们可以定义许多不同类型的vector,比如vector<int或vect
Wesley13 Wesley13
3年前
C++ 模板基础
我们学习使用C,肯定都要了解模板这个概念。就我自己的理解,模板其实就是为复用而生,模板就是实现代码复用机制的一种工具,它可以实现类型参数化,即把类型定义为参数;进而实现了真正的代码可重用性。模版可以分为两类:一个是函数模版,另外一个是类模版。举个最简单的例子,当在编写好了一个进行int型交换的swap函数,而此后若又要进行double型交换,那就得重
Stella981 Stella981
3年前
GridManager loading样式修改
在使用gridmanager表格组件时,如果想要改变loading样式该如何处理?gridmanager提供的loadingTemplate参数可以快速的解决这个问题。loadingTemplate参数的介绍:参数类型:String默认值:''数据加载中模板,该配置可以自定义数据加载时使用的loading样式。使用该
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
贾蔷 贾蔷
1个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们