顺序容器Primer

news2024/11/16 5:44:39

顺序容器在以下方面都有不同的性能折衷:

1.像容器中添加和删除元素的代价;

2.非顺序访问容器中元素的代价;

原因:容器的存储要么采用数组型,要么链式存储,前者导致不能随机添加删除,后者不能随机访问,

容器的操作集:

iterator 迭代器类型

const iterator 可以读取元素,但不能修改元素的迭代器类型;

size_type 无符号整数类型,该类型的取值范围可以容纳最大容器所保存的元素大小;

value_type元素类型;

reference 元素的左值类型;

const_reference 元素的const 左值类型;

构造函数:

C c;默认构造函数

C c1(c2);拷贝构造函数

C c(b,e);根据迭代器构造c,·   

C c{a,b,c};  列表初始化c;

添加/删除元素

c.insert(args);插入args

c.emplace(inits);插入inits;

c.erase(args);删除args;

c.clear();清空c内所有元素;

c.cbegin(),c.cend();返回const_iterator;

反向容器

reverse_iterator 按逆序寻址元素的迭代器;

const_reverse_iterator不能修改元素的逆序迭代器;

c.rbegin(),c.rend()返回指向尾元素和首元素之前位置的迭代器;

c.crbegin(),c.crend()返回const_reverse_iterator;

 反向迭代器:反向遍历容器的迭代器,对一个反向迭代器执行++操作,会得到上一个元素,--操作会得到下一个元素,即以相反的顺序来看待容器;

类型别名:通过类型别名,即使我们不了解容器中元素的类型,我们也可以定义相同类型的变量;

 

difference_type是一种无符号整型;

begin,end成员

包括cbegin,cend,rbegin,rend;

容器的定义和初始化

拷贝构造函数要求两个变量的容器类型和元素必须相同,列表初始化和迭代器则保持相容就可以了,即允许隐式类型转换;

初始化列表隐含指定了容器的大小;

只有顺序容器的构造函数才接受大小参数,关联容器并不支持;

assign操作

assign:允许隐式类型转换,从相同容器不同但相容的类型元素的赋值;

seq.assign(b,e);将seq中的元素替换为迭代器b,e所表示的范围内的元素;b,e不能指望seq中的元素;

seq.assign(il);将seq内的元素替换为初始化列表il内的元素;

seq.assign(a,t);将seq内的元素替换为a个值为t的元素;

 swap:直接交换容器的地址;

swap不对任何元素进行插入删除,拷贝操作,因此swap的操作时间为常数;只是交换了地址;元素不会被移动;但array会真正的交换元素;

容器大小操作:

size:容器内元素的个数;

empty:容器是否为空,

max_size:可容纳的最大大小

关系运算符:

每个容器都支持==,!=,除了无序容器外都支持关系运算符>,<,>=,<=,关系运算符两侧的容器类型和元素类型必须相同,容器的比较实际上进行元素的逐对比较,与string的关系运算符很像:

两个容器大小相同且所有元素对应相等,则相等,否则不等;

两个容器大小不等,但小容器每个元素都等于较大容器内的元素,则小容器小于大容器;

两个容器都不是另一个容器的前缀子序列,比较结果取决于第一个不相等的元素的比较结果;

使用关系运算符的前提是容器内元素类型定义了相应的比较运算符;


顺序容器操作

c.push_bck(t);c.emplace_back(t).在c的尾部创建一个值为t的元素,返回void;

c.push_front(t),c.emplace_front(t)在c的头部创建一个值为t的元素,返回void;

c.insert(p,t)在迭代器p指向的元素之前创建一个置为t的元素,返回指向新添加的元素的迭代器;

c.insert(p,n,t)在迭代器p指向的元素之前创建n个值为t的元素,返回指向新添加的第一个元素的迭代器,若n为0,返回p;

c.insert(p,b,e)将迭代器b,e范围内的元素插入到迭代器p指向的元素之前,b,e不能指向c中的元素,返回新添加的第一个元素的迭代器;若范围为空则返回p;

c.insert(p,il);il是初始化列表,initializer_list<typename>类型的,将这些给定值插入到 p指向的元素之前,返回指向新添加的第一个元素的迭代器;若列表为空,则返回p;

尾插法:push_back()

 头插法:push_front():list,deque,forward_list支持该操作,即头插法;


insert

特定位置添加元素:insert(),允许在任意位置插入元素,vector,list,deque,string都提供了该操作;forward_list提供了特殊版本的insert成员,使用insert()可以模拟push_front();

insert有多次重载,插入内容包括特定元素或者某个范围内的元素;

不同于push_back返回void,insert返回的是插入后第一个元素的迭代器值(插入为空时返回原迭代器),因此可以实现反复插入元素;

list<string>lst;
auto iter=lst.begin();
while(cin>>word)
iter=lst.insert(iter,word);

emplace

emplace,使用元素类型的构造函数在容器的某位置直接创建一个元素,其参数类型与类型构造函数参数特征一致,但对于push_back()则是使用临时对象来在容器内插入元素,过后该变量即被释放;即使用了析构函数,可能存在深拷贝,浅拷贝的问题;

c.emplace_back("97805928",25,15);使用这些参数调用构造函数,而后放进容器中;

c.push_back(sales_Data("97805928",25,15));创建临时对象,过后即被销毁,emplace开销更小;

重点:emplace的参数必须与元素类型的构造函数相匹配;


访问元素

c.front(),c.back();获得容器的首尾元素的引用;

访问操作:

c.back,c.front;c[n],c.at(n)


 删除元素:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第六十二天—图论补充

理论基础&#xff1a; 第一题、所有可能的路径 力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void dfs(vector<vector<int>>& graph, int x){if(x graph.size() - 1){result.push_back(path);retu…

【Python】面向对象 - 继承 ① ( 继承概念 | 继承语法 | 单继承与多继承 | 代码示例 )

文章目录 一、继承简介1、继承概念2、继承语法3、单继承与多继承 二、代码示例1、代码示例 - 单继承2、代码示例 - 多继承 一、继承简介 1、继承概念 继承 是 面向对象 特性之一 , ( 封装 - 继承 - 多态 ) 继承 可以 令一个类 从 另一个类 中 继承 该类的 属性 和 方法 , 继承…

创建数据库,删除数据库

1.创建数据库&#xff0c;删除数据库&#xff0c;查询创建数据的语句&#xff0c;使用数据库&#xff0c;查询当前默认的数据库以及使用的编码方式校验规则 2.数字&#xff0c;文本&#xff0c;日期在一章表中定义多个字段&#xff0c;要使用今天提到的所有的数据类型 登入roo…

SpringBoot的CSGO赛事管理系统

线考试系统的开发运用java技术&#xff0c;MIS的总体思想&#xff0c;以及MYSQL等技术的支持下共同完成了该系统的开发&#xff0c;实现了在线考试管理的信息化&#xff0c;使用户体验到更优秀的在线考试管理&#xff0c;管理员管理操作将更加方便&#xff0c;实现目标。

跳木桩----(爱思创)

源代码 #include <bits/stdc.h> using namespace std;int main(){int n,a[10010],maxd,ans0;cin>>n;for(int i1;i<n;i){cin>>a[i];}cin>>maxd;sort(a1,an1);for(int i1;i<n;i){if(a[i]-a[i-1]<maxd){ans;}else{break;}}cout<<ans<&…

NLP(五十九)使用FastChat部署百川大模型

本文将会介绍如何使用FastChat来部署国产大模型——百川模型。 在此之前&#xff0c;我们先来了解两个概念——百川模型和FastChat. 百川模型 2023年6月15日&#xff0c;被称为「中国 ChatGPT 梦之队」的百川智能公司&#xff0c;推出了 70 亿参数量的中英文预训练大模型——b…

Java 匿名对象

一、简介 1.1.含义 没有名字的对象 。以常规的创建对象的方法&#xff1a; AtomicInteger atomicInteger new AtomicInteger(100000);格式&#xff1a; 类名 变量名 new 类名(); 这样就完成了对象的创建。注意&#xff1a;&#xff08;&#xff09;内可以无参数&#xff0c…

津津乐道设计模式 - 状态模式详解(以交通信号灯举例带你快速理解)

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Anaconda删除虚拟环境

# 查看环境&#xff0c;确定待删除环境位置 conda env list# 按照位置进行删除 conda env remove -p 要删除的虚拟环境路径举例&#xff1a; 删除py37执行如下命令&#xff1a; conda env remove -p D:\A\envs\py37

【GAN】基础知识(还在更新)

还没写完&#xff0c;别骂了.....遇到啥新东西也会补充进来 1. 损失函数/距离度量 1.1 KL散度 用来衡量分布之间距离 1.1.1 推导过程 如果想要对KL散度有一个比较好的理解&#xff0c;我其实建议看一下&#xff0c;从信息熵的角度入手我认为是一个比较好的切入点 相对熵&a…

RC-u5 树与二分图(二分图)

PTA | 程序设计类实验辅助教学平台 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N2e610; int st[N]; ll n,m;//数据可能超int int h[N],ne[N],e[N],idx; void add(int a,int b) {e[idx]b,ne[idx]h[a],h[a]idx; } void dfs(int v,int co…

基于Web的数字孪生智慧养老院可视化云平台

前言 我国已经迈入老龄化社会&#xff0c;老龄化社会中养老已然成为社会普遍关注的焦点&#xff0c;智慧养老成为未来趋势。 建设背景 社会因素 养老床位数量也增长至2020年的821万张.每千名老人拥有养老床位增长至35张,相对于先进国家的50-7O张仍有较大差距。目前养老床位…

python_day4

def test():return 1, a, Truex, y, z test() print(f"x{x},y{y},z{z}")位置参数&#xff1a;调用时根据参数位置传递参数 关键字参数&#xff1a;调用时通过“键值”形式传参 def user(name, age, gender):print(f"name:{name},age:{age},gender:{gender}&q…

Python django开发

第一步&#xff1a;创建开发环境 mkvirtualenv py2_django 第二步&#xff1a;安装django pip install django2.2.5 # 选择2.2.5的原因是这个版本是持久维护的 pip list # 查看安装的信息 第三步&#xff1a;start 一个项目&#xff0c;并创建子应用 cd ~/Myproject # 选择…

4.2 图书借阅系统数据库设计 --MySQL

本文目录 前言一、背景和需求分析1.1 背景1.2 信息需求1.3 功能需求管理员学生 1.4 数据流图 二、概念结构设计1. 抽象出系统实体2. 局部E-R图2.1 学生 E-R图2.2 借阅证 E-R图2.3 图书 E-R图2.4 管理员 E-R图2.5 公告 E-R图2.6 申请 E-R图2.7 借阅 E-R图2.8 评论 E-R图2.9 收藏…

❤ Vue2+vue-cli+vue-router+vuex +elementUI/vant完整项目搭建 项目和配置(一)

Vue2vue-clivue-routervuex elementUI/vant项目搭建和配置webpack&#xff08;一&#xff09; 项目整套&#xff1a;Vue2vue-clivue-routervuex elementUI/vant 1、环境检测&#xff1a; node 环境 git --version git 环境 git --version npm 环境 npm -v 查看VUE脚手架版本 …

响应式编程实战(02)-响应式编程的适用场景

0 知识前提 已掌握响应式编程中的核心概念&#xff1a;响应式流、背压机制以及响应式流规范。 1 引言 响应式编程能够应用到那些具体的场景呢? 目前有哪些框架中使用到了这一新型的技术体系呢? 2 响应式编程的应用场景分析 可以认为响应式编程并不仅仅是一种编程技术&a…

OpenPCDet系列 | 8.1 nuScenes数据集的处理流程与gt_sample的database构建

1. nuScenes Dataloader 对nuScenes数据集处理的了解&#xff0c;大体上的核心还是getitem函数、prepare_data函数&#xff0c;以及collate_batch函数三个部分的处理。其中prepare_data函数和collate_batch函数是在Dataset这个父类实现的&#xff0c;基本的处理流程基本不变&a…

《Redis 核心技术与实战》课程学习笔记(六)

哨兵集群 哨兵机制的基本流程 在 Redis 主从集群中&#xff0c;哨兵机制是实现主从库自动切换的关键机制。 哨兵其实就是一个运行在特殊模式下的 Redis 进程&#xff0c;主从库实例运行的同时&#xff0c;它也在运行。哨兵主要负责的就是三个任务&#xff1a;监控、选主&…

三种SQL实现聚合字段合并(presto、hive、mysql)

需求&#xff1a;按照项目名&#xff0c;以逗号合并参与人 presto select item_name,array_join(array_agg(name),,) as group_name from test.test_04 group by item_name order by item_name hive select item_name,concat_ws(,,collect_set(name)) as group_name from tes…