C++基础语法学习:STL
基础语法学习,少点比较,多些谦虚
1.容器:
常见的容器有以下几类:
1.vector:向量
2.deque:双端队列
3.list:列表
4.set:集合
5:multiset:多重集合
6.map:映射
7:multimap:多重映射
2.迭代器:
迭代器的话,其实可以简单点理解就是一个指向容器内部的指针,比如我们现在伸出一根指针i,它可以进行任意的前后移动,同时我们可以取到指针i对应的内容,这就是迭代器,然后我们实际上操作这些容器,就是在操作迭代器。
声明方式有很多,比如s.begin()和s.end(),
容器类名::iterator 迭代器名等
当然了iterator前面还可以加一些限定符,比如const_iterator代表获得的是常量迭代器,reverse_iterator获得反向迭代器,const_reverse_iterator获得常量反向迭代器
声明迭代器需要头文件
3.函数对象
如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来像函数调用,实际上也执行了函数调用,因而得名。
就是,函数对象其实也就是一个类,不过在指定的操作符函数里对某个数据进行了处理,然后得到一个另外的数据类型,这样操作起来就好像是在进行了函数操作一样,目前不知道这样做有什么含义
public:
double operator()(int a1, int a2, int a3)
{ //重载()运算符
return (double)(a1 + a2 + a3) / 3;
}
};
4.算法
这个就不多说了,就是一些STL中自带的方法,比如取平均数,比大小什么的,这个就不用过多赘述了
STL中的算法需要包含头文件
5.vector中的属性和方法
1.构造方法
vector():创建一个空vector
vector(int nSize):创建一个vector,元素个数为nSize
vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
vector(const vector&):复制构造函数
vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
2.增加函数
void push_back(const T& x):向量尾部增加一个元素X
iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
3.删除函数
iiterator erase(iterator it):删除向量中迭代器指向元素
iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
void pop_back():删除向量中最后一个元素
void clear():清空向量中所有元素
4.遍历函数
reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
5.判断函数
bool empty() const:判断向量是否为空,若为空,则向量中无元素
int size() const:返回向量中元素的个数
int capacity() const:返回当前向量所能容纳的最大元素值
int max_size() const:返回最大可允许的 vector 元素数量值
6.其他函数
void swap(vector&):交换两个同类型向量的数据
void assign(int n,const T& x):设置向量中前n个元素的值为x
void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
7.常见方法
push_back 在数组的最后添加一个数据
pop_back 去掉数组的最后一个数据
at 得到编号位置的数据
begin 得到数组头的指针
end 得到数组的最后一个单元+1的指针
front 得到数组头的引用
back 得到数组的最后一个单元的引用
max_size 得到vector最大可以是多大
capacity 当前vector分配的大小
size 当前使用数据的大小
resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
reserve 改变当前vecotr所分配空间的大小
erase 删除指针指向的数据项
clear 清空当前的vector
rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
empty 判断vector是否为空
swap 与另一个vector交换数据
6.deque 双端队列:
双端队列和向量比起来的话,就是说双端队列本身的算法就是在两头添加或删除数据,其时间复杂度是1,也就是说如果是经常会进行头尾增删的数据结构,尽量选用deque,当然用vector应该或者别的数据结构也是可以的,其实这个结构本身感觉没有其特别的特色,不过要注意的是:eque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。
这个感觉不怎么会用到,所以这里的话我就不看了,如果将来回看这个有用的话,可以查看这条博客
7.list 列表
列表,其实准确的说是一个双向链表,具体怎么实现的就不过多赘述了,这样的存储结构也不用多嘻嘻哈哈别的,它在任意位置增删的时间复杂度都是1,移动元素的速度也最快,是一个效率非常高的数据结构,这可不是随便和什么vector和array可以嘻嘻哈哈的啊。当然了这么牛逼的list也有它的问题:不能随机存取数据,也就是说不能像vector那样直接给一个位置,就可以直接转到指定的元素上去,而是只能一个个遍历,直到找到指定的位置才行。
这个很重要,着重写一下。
1.创建方法:
std::list<int> values;
std::list<int> values(10);
//拷贝普通数组,创建list容器
int a[] = { 1,2,3,4,5 };
std::list<int> values(a, a+5);
//拷贝其它类型的容器,创建 list 容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::list<int>values(arr.begin()+2, arr.end());//拷贝arr容器中的{13,14,15}
2.常用方法
8.set集合
这位更是重量级
set其实也是键值对,这点和map很像,但是又有些不同,因为set中的键值必须相等,也就是key 和 value两个值都必须相等,比如
上面的数据就不能组成set,下面的才可以,当然了,既然如此那set就不用写键值对了,直接每个元素写一个值就可以了。
set容器有两个特点,一是:不可以存在有重复的键值对 二是:输入元素数据之后会自动排序。
对于初学者来说,切勿尝试直接修改 set 容器中已存储元素的值,这很有可能破坏 set 容器中元素的有序性,最正确的修改 set 容器中元素值的做法是:先删除该元素,然后再添加一个修改后的元素。
1.初始化:
std::set<std::string> myset;
std::set<std::string> myset{"http://c.biancheng.net/java/",
"http://c.biancheng.net/stl/",
"http://c.biancheng.net/python/"};
std::set<std::string> copyset(myset);
//等同于
//std::set<std::string> copyset = myset
std::set<std::string> myset{ "http://c.biancheng.net/java/",
"http://c.biancheng.net/stl/",
"http://c.biancheng.net/python/" };
//copyset方法支持从某个元素开始到某个元素结束,皆可自由指定
std::set<std::string> copyset(++myset.begin(), myset.end());
2.常用方法
3.multiset:
和set的区别?同样是排序好的集合,但是multiset允许有相同的元素
个人感觉没什么含义,不如直接vector排序,追求极致性能的时候可能有用,详情见
在学习掌握set和multiset过程中,我们会了解到set和multiset是存在一定差异的;
在set中每个元素的值都唯一,并且元素在插入后会自动的为其升序排序,值得注意的是set中数元素的值不能直接被改变。
C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。
区别:
set不能插入已有的数据,即不能重复插入;multiset可以实现;
set在插入数据同时会返回插入成功失败结果;
multiset不会实现数据监测;
9.map映射
和set差不多,但是不同的是map是键值对,其中的数据是一对一的,且key不能重复,但是value可以,容器会根据key的大小来进行排序,
1.构造方式
std::map<std::string, int>myMap;
std::map<std::string, int>myMap{ {"C语言教程",10},{"STL教程",20} };
std::map<std::string, int>myMap{std::make_pair("C语言教程",10),std::make_pair("STL教程",20)};
std::map<std::string, int>newMap(myMap);
std::map<std::string, int>newMap(++myMap.begin(), myMap.end());
2.常用方法
C++基础语法学习:STL的更多相关文章
- Swift基础语法学习总结(转)
Swift基础语法学习总结 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...
- Swift基础语法学习总结
Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...
- Python 基础语法学习(第一讲)---类的使用
[写在前面]:其实自学python有一段时间了,但是一直没想起来要写博客来记录自己的学习,今天才感觉要写点什么让自己学的更扎实一点,所以从今天开始更新python自学系列,希望看见文章的大佬们可以指点 ...
- Java基础语法学习
Java基础语法学习 1. 注释 单行注释: //单行注释 多行注释: /*多行注释 多行注释 多行注释 多行注释 */ 2. 关键字与标识符 关键字: Java所有的组成部分都需要名字.类名.变量名 ...
- java 基础语法学习01
Java基础语法 注释 初次使用idea时相关配置 new project ->Empty project->进入页面 再选择file->project structure-> ...
- React基础语法学习
React主要有如下3个特点: 作为UI(Just the UI) 虚拟DOM(Virtual DOM):这是亮点 是React最重要的一个特性 放进内存 最小更新的视图,差异部分更新 diff算法 ...
- Go基础语法学习
Go语言基础 Go是一门类似C的编译型语言,但是它的编译速度非常快.这门语言的关键字总共也就二十五个,比英文字母还少一个,这对于我们的学习来说就简单了很多.先让我们看一眼这些关键字都长什么样: 下面列 ...
- Xpath基础语法学习
背景: 之所以学习Xpath,是因为在学习selenium定位页面元素,总是定位不到元素.为了更好的开展自动化测试,先学习下Xpath. 一:Xpath是什么. 1:Xpath是一门在XML文档中查找 ...
- Swift基础语法学习总结一
1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型,几乎所有类型都是可打印的. ...
- Java基础语法学习知识
基础概念 标识符1.由字母,数字,下划线,美元符组成2.首字母不能是数字3.不能是关键字和保留字4.能反映其作用 关键字1.有特定含义2.用于特定地方3.用来命名标识符 常量1.程序执行时值不变的量2 ...
随机推荐
- 2流高手速成记(之三):SpringBoot整合mybatis/mybatis-plus实现数据持久化
接上回 上一篇我们简单介绍了基于SpringBoot实现简单的Web开发,本节来看Web开发中必不可少的内容--数据持久化 先看项目结构: 1. 创建数据表 打开mysql,打开数据库 test (没 ...
- 【LeetCode第 313 场周赛】忘光光
比赛链接 最近不怎么打比赛,不能马上反应过来考察的是什么,全部忘光光了... 6192. 公因子的数目 题意: 给定 \(a\) 和 \(b\),问两者的公因子数量 数据范围:\(1\leq a,b\ ...
- 带有pwn环境的Ubuntu22.04快速安装
pwn环境ubuntu22.04快速安装(有克隆vmk) ubuntu更新到了22.04版本,经过本人测试后非常的好(ma)用(fan),该版本和mac很相像,而且用起来也比较丝滑,只不过配置上稍微有 ...
- tableau server 数据备份及恢复
tableau server 数据备份及恢复 一.数据备份 1> win+r,进入到dos命令行模式 2> 进入到tableau server的bin路径下 cd C:\Program F ...
- 关于IOC容器
1.什么是 IOC (1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理 (2)使用 IOC 目的:为了耦合度降低
- 某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批
某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条:如果员工请假天数大于等于3天,小于10天,经理可以审批:如果员工请假天数大于等于10天,小于30天,总经理可以审批 ...
- 各大厂 C/C++ 编程规范详解
来吧!各大厂知名规范体系~ 各有特点各有侧重~ Google C++ Style Guide Google C++ Style Guide,[中文版],简称 GSG,谷歌的 C++ 编程规范,在国内有 ...
- python关于Django搭建简单博客项目 详解二-setting.py
这一篇我们来讲解setting.py,具体内容以注释形式写入到下面的setting.py代码中,篇幅所限已把官方所给英文注释删除. 全部源代码和详解请参看http://github.com/Cheng ...
- element-ui v-table 复选框默认选中
<el-table ref="refTable" :data="list" v-loading="listLoading" eleme ...
- Mysql之MGR高可用实战案例
MGR高可用实战案例 1.环境准备 node1 rocky8.6 10.0.0.8 node2 rocky8.6 10.0.0.18 node3 rocky8.6 10.0.0.28 2.所有节点更改 ...