基础语法学习,少点比较,多些谦虚

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 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。

这个感觉不怎么会用到,所以这里的话我就不看了,如果将来回看这个有用的话,可以查看这条博客

C++ STL deque容器 详解版

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不会实现数据监测;

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的更多相关文章

  1. Swift基础语法学习总结(转)

    Swift基础语法学习总结 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...

  2. Swift基础语法学习总结

    Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础  1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...

  3. Python 基础语法学习(第一讲)---类的使用

    [写在前面]:其实自学python有一段时间了,但是一直没想起来要写博客来记录自己的学习,今天才感觉要写点什么让自己学的更扎实一点,所以从今天开始更新python自学系列,希望看见文章的大佬们可以指点 ...

  4. Java基础语法学习

    Java基础语法学习 1. 注释 单行注释: //单行注释 多行注释: /*多行注释 多行注释 多行注释 多行注释 */ 2. 关键字与标识符 关键字: Java所有的组成部分都需要名字.类名.变量名 ...

  5. java 基础语法学习01

    Java基础语法 注释 初次使用idea时相关配置 new project ->Empty project->进入页面 再选择file->project structure-> ...

  6. React基础语法学习

    React主要有如下3个特点: 作为UI(Just the UI) 虚拟DOM(Virtual DOM):这是亮点 是React最重要的一个特性 放进内存 最小更新的视图,差异部分更新 diff算法 ...

  7. Go基础语法学习

    Go语言基础 Go是一门类似C的编译型语言,但是它的编译速度非常快.这门语言的关键字总共也就二十五个,比英文字母还少一个,这对于我们的学习来说就简单了很多.先让我们看一眼这些关键字都长什么样: 下面列 ...

  8. Xpath基础语法学习

    背景: 之所以学习Xpath,是因为在学习selenium定位页面元素,总是定位不到元素.为了更好的开展自动化测试,先学习下Xpath. 一:Xpath是什么. 1:Xpath是一门在XML文档中查找 ...

  9. Swift基础语法学习总结一

    1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型,几乎所有类型都是可打印的. ...

  10. Java基础语法学习知识

    基础概念 标识符1.由字母,数字,下划线,美元符组成2.首字母不能是数字3.不能是关键字和保留字4.能反映其作用 关键字1.有特定含义2.用于特定地方3.用来命名标识符 常量1.程序执行时值不变的量2 ...

随机推荐

  1. 5.监控MySQL

    prometheus监控MySQL需要用到mysql_exporter. mysql_exporter 项目地址:https://github.com/prometheus/mysqld_export ...

  2. RDS MySQL内存管理

    官方文档地址:https://help.aliyun.com/product/26090.html?spm=5176.7920929.1290474.7.2c6f4f7bACaToi 官方文档地址:h ...

  3. jmeter录制登录脚本

    1.添加代理服务器 在非测试元件添加http代理服务器,端口写8888,域写127.0.0.1 在排除模式里填入.*.(js|css|PNG|jpg|ico|png|gif|woff|ttf).* 2 ...

  4. Node.js(三)Lodash

    npm init -y(初始化项目) npm i --save lodash(引入lodash) const _=require("lodash"); let stus=[ {id ...

  5. Skywalking Swck Agent注入实现分析

    项目地址: GitHub - apache/skywalking-swck: Apache SkyWalking Cloud on Kubernetes 项目简介: A bridge project ...

  6. 洛谷P1908 逆序对 (树状数组+离散化)

    模板题,树状数组加上离散化求逆序对. 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 ...

  7. 删除数组里含有a的元素,并且将null值放在后面

    想去掉里面含有a的元素,并将null放在后面.放在后面就是往后移,其他值往左移 1 public static void main(String[] args) { 2 //自定义的一个数组 3 St ...

  8. MasaFramework -- 缓存入门与规则配置

    概念 什么是缓存,在项目中,为了提高数据的读取速度,我们会对不经常变更但访问频繁的数据做缓存处理,我们常用的缓存有: 本地缓存 内存缓存:IMemoryCache 分布式缓存 Redis: Stack ...

  9. 靶机: easy_cloudantivirus

    靶机: easy_cloudantivirus 准备 下载靶机(Target):https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/ ...

  10. Selenium4+Python3系列(五) - 多窗口处理之句柄切换

    写在前面 感觉到很惭愧呀,因为居然在Selenium+Java系列中没有写过多窗口处理及句柄切换的文章,不过也无妨,不管什么语言,其思路是一样的,下面我们来演示,使用python语言来实现窗口句柄的切 ...