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 ...
随机推荐
- aardio + AutoHotkey 混合编程
本文主要介绍 aardio + AutoHotkey 混合编程. 在 aardio 中可以调用很多编程语言,例如 C语言.C++.C#.Java.Python.R.Javascript.Node.Js ...
- 【前端必会】tapable、hook,webpack的灵魂
背景 什么是tapable.hook,平时做vue开发时的webpack 配置一直都没弄懂,你也有这种情况吗? 还是看源码,闲来无聊又看一下webpack的源码,看看能否找到一些宝藏 tapable和 ...
- docker搭建yapi接口文档系统、Idea中上传接口、在线调用
一.前言 在我们后端开发中,必不可少的是接口的交接,有很多种方式,常见的就是swagger,不过这个侵入性太强了.还有就是接口文档的框架,比如今天小编带大家一起搭建的yapi,在公司还是挺常见的! 今 ...
- numpy中的一些常用的关键字用法
1.np.full() 原型:numpy.full(shape, fill_value, dtype=None, order='C') eg: 2.np.flatten():该函数返回一个折叠成一维的 ...
- Flutter Cocoon 已达到 SLSA 2 级标准的要求
文/ Jesse Seales, Dart 和 Flutter 安全工作组工程师 今年年初,我们发布了 Flutter 2022 产品路线图,其中「基础设施建设」这部分提到:2022 年 Flutte ...
- 分布式存储系统之Ceph集群启用Dashboard及使用Prometheus监控Ceph
前文我们了解了Ceph之上的RadosGW基础使用相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16768998.html:今天我们来聊一聊Ceph启 ...
- Dytechlab Cup 2022 (A - C)
Dytechlab Cup 2022 (A - C) A - Ela Sorting Books 分析:贪心,将字符串每一位都存在map里,从前往后尽量让每一个\(n / k\)的段\(mex\)值尽 ...
- 集合元素的遍历操作,使用迭代器Iterator接口
1.内部的方法:hasNext() 和 next() 推荐的方式: //hasNext():判断是否还有下一个元素while(iterator.hasNext()){ //next():①指针下移 ② ...
- 集训队互测2016Unknown(UOJ191)
题目链接 前面部分和lzz的题解是一样的. 首先将输入点(x,y)变为(-y,x)然后,只需找一个向量与(-y,x)的点积最大,即找一个向量在(-y,x)上的投影最长.此时所有的点都是在x轴上方的,容 ...
- 论文解读(GLA)《Label-invariant Augmentation for Semi-Supervised Graph Classification》
论文信息 论文标题:Label-invariant Augmentation for Semi-Supervised Graph Classification论文作者:Han Yue, Chunhui ...