STL中常用容器及操作 学习笔记1
@[TOC](下面介绍STL中常见的容器及操作)
## 不定长数组 vector
> vetcor:其实就是一个数组或者说是容器 其操作不同于之前直接定义的数组
> 而且可以直接赋值也可以直接作为函数参数或者返回值
### 1 头文件
```cpp
#include<vector>
```
### 2 定义类型方法
> 可定义基本数据类型 如:int ,double,string 等
> 还可以定义指针、结构体等
```cpp
#include <iostream>
#include <vector>
#include <cstring>
#include<algorithm>
using namespace std;
struct k{
int m,n;
};
int main()
{
vector<int>v1; //定义int类型
vector<string>v2;// 定义string 类型
vector<k>v3; //定义结构体类型
}
```
### 3 构造方法
```cpp
#include <iostream>
#include <vector>
#include <cstring>
#include<algorithm>
using namespace std;
int main()
{
vector<int>v1(5); //5个int类型元素 初始化为0
for(int i=0;i<5;i++)
cout<<v1[i]<<' '; //输出结果为 0 0 0 0 0
vector<int>v2(5,10);// 5个int类型元素 初始值为10
for(int i=0;i<5;i++)
cout<<v2[i]<<' ';// 输出结果为 10 10 10 10 10
vector<int>v3(v2);// 用v2初始化v3
for(int i=0;i<5;i++)
cout<<v3[i]<<' ';// 输出结果为 10 10 10 10 10
vector<int>::iterator its=v2.begin();//指向头的迭代器
vector<int>::iterator ite=v2.end();//指向尾的迭代器
vector<int>v4(its,ite);//用迭代器之间的值初始化v4
for(int i=0;i<5;i++)
cout<<v4[i]<<' ';// 输出结果为 10 10 10 10 10
}
```
### 4 容量与大小
> **capacity**:可获取vector容量
> **reserve**:修改容量,但只能变大,不能变小
> **size**: 容器中有效元素的个数 与容量大小无关
> **resize**:改变元素个数,缩小时容量不变,放大时容量改变
> **empty**:判断容器是否为空 是空返回1 不是返回0
```cpp
#include <iostream>
#include <vector>
#include <cstring>
#include<algorithm>
using namespace std;
int main()
{
vector<int>v1(10);
cout<<v1.capacity()<<endl;//输出结果为 10
v1.reserve(12);
cout<<v1.capacity()<<endl;//输出结果为 12
cout<<v1.size()<<endl; //输出结果为 10
v1.resize(13);
cout<<v1.size()<<' '<<v1.capacity()<<endl;//输出结果为13 20
//(增加新元素 容量超过原始容量 容量加倍)
v1.resize(6);
cout<<v1.size()<<' '<<v1.capacity()<<endl;//输出结果为 13 20
cout<<v1.empty()<<endl;//输出结果为 0
vector<int>v2;
cout<<v2.empty()<<endl;//没有元素 输出结果为 1
}
```
### 5 主要函数
> 1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据
### 6 基本操作
- **输出元素**
使用下标输出元素
使用迭代器输出元素
```cpp
#include <iostream>
#include <vector>
#include <cstring>
#include<algorithm>
using namespace std;
int main()
{
vector<int>v1(5,6);
for(int i=0;i<5;i++)
cout<<v1[i]<<endl;//下标输出
vector<int>::iterator it;//迭代器输出
for(it=v1.begin();it!=v1.end();it++)
cout<<*it<<endl;
}
```
- **插入元素**
尾部插入元素:push_back()
中间插入元素:insert()
实际操作中 尾部插入元素效率高 中间插入效率低
```cpp
#include <iostream>
#include <vector>
#include <cstring>
#include<algorithm>
using namespace std;
int main()
{
vector<int>v1;
for(int i=0;i<5;i++)
v1.push_back(i);//尾部插入元素
for(int i=0;i<5;i++)
cout<<v1[i]<<' ';//输出结果为 0 1 2 3 4
cout<<endl;
v1.insert(v1.begin()+1,9); // 在指定迭代器位置加入一个元素
for(int i=0;i<5;i++)
cout<<v1[i]<<' ';//输出结果为 0 9 1 2 3
cout<<endl;
v1.insert(v1.begin()+2,3,8);// 在指定迭代器后加入3个值为8的元素
vector<int>::iterator it;
for(it=v1.begin();it!=v1.end();it++)
cout<<*it<<' ';//输出结果为 0 9 8 8 8 1 2 3 4
cout<<endl;
vector<int>v2;
v2.insert(v2.begin(),v1.begin(),v1.begin()+4);//在指定迭代器后加入另一个容器的中间一段
for(int i=0;i<4;i++)
cout<<v2[i]<<' ';//输出结果为 0 9 8 8
cout<<endl;
}
```
- **删除元素**
删除尾部元素:pop_back()
删除指定元素:erase()
删除全部元素(清空):clear()
```cpp
#include <iostream>
#include <vector>
#include <cstring>
#include<algorithm>
using namespace std;
int main()
{
vector<int>v1;
for(int i=0;i<5;i++)
v1.push_back(i);//尾部插入元素
for(int i=0;i<5;i++)
cout<<v1[i]<<' ';//输出结果为 0 1 2 3 4
cout<<endl;
v1.pop_back();//删除尾部元素
v1.erase(v1.begin()+1);//删除第2个元素
v1.erase(v1.begin(),v1.begin()+2);//删除第1个到第3个元素
v1.clear();//删除所有元素
}
```
- 其他函数
>**v.swap(v1)** 将v与v1进行交换
**front** 得到数组头的引用
**back** 得到数组的最后一个单元的引用
**max_size** 得到vector最大可以是多大
**rbegin** 将vector反转后的开始指针返回(其实就是原来的end-1)
**rend** 将vector反转构的结束指针返回(其实就是原来的begin-1)
## 集合 set
**set简介**
> set 是 STL 中一种标准关联容器,封装了一种高效的平衡检索二叉树——红黑树。
set是用来存储同一数据类型的集合,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。
标准库提供set关联容器分为:
1,按关键字有序保存元素:set(关键字即值,即只保存关键字的容器);multiset(关键字可重复出现的set);
2,无序集合:unordered_set(用哈希函数组织的set);unordered_multiset(哈希组织的set,关键字可以重复出现)。
平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。
构造set集合主要目的是为了快速检索,不可直接去修改键值。
当出现需要去掉重复元素的情况,而且有可能因这些元素比较大或者类型不是int 型而不能直接开散列表时,就可以用set来保留元素本身而不考虑它的个数,并且set可以自动排序;
### 1 头文件
```cpp
#include<set>
```
### 2 定义类型与构造方法
> 可定义基本数据类型 以及结构体等
```cpp
#include <iostream>
#include <set>
#include <functional>
using namespace std;
int main()
{
set<int> s1; //默认是小于比较器less<int>的s1
set<int, greater<int> > s2; //创建一个带大于比较器的s2
// 需包含头文件functional
int a[5] = {1,2,3,4,5};
set<int> s3(a,a+5); //数组a初始化一个s3
set<int> s4(s3.begin(),s3.end()); //用s3区间构造s4
set<int> s5(s4); //拷贝s4构造创建s5
}
```
### 3 主要函数
```cpp
begin(); // 返回指向第一个元素的迭代器
end(); // 返回指向迭代器的最末尾处
clear(); // 清除所有元素
count(); // 返回某个值元素的个数
empty(); // 如果集合为空,返回true
equal_range(); //返回集合中与给定值相等的上下限的两个迭代器
erase(); //删除集合中的元素
find(); //返回一个指向被查找到元素的迭代器
get_allocator(); //返回集合的分配器
insert(); //在集合中插入元素
lower_bound(); //返回指向大于(或等于)某值的第一个元素的迭代器
upper_bound(); //返回大于某个值元素的迭代器
key_comp(); //返回一个用于元素间值比较的函数
max_size(); //返回集合能容纳的元素的最大限值
rbegin(); //返回指向集合中最后一个元素的反向迭代器
rend(); //返回指向集合中第一个元素的反向迭代器
size(); //集合中元素的数目
swap(); //交换两个集合变量
value_comp(); //返回一个用于比较元素间的值的函数
```
### 4 基本操作
- **添加与访问元素**
```cpp
#include <iostream>
#include <set>
#include <functional>
using namespace std;
int main()
{
set<int>s1={4,5,6,7};
s1.insert(2);
s1.insert(5);
cout<<s1.size()<<endl;//结果为5 可以发现set中无重复元素
set<int>::iterator it;//set只能通过迭代器输出 无法用下标输出
for(it=s1.begin();it!=s1.end();it++)
cout<<*it<<' ';//结果为 2 4 5 6 7
cout<<endl;
}
```
- **查找元素**
```cpp
#include <iostream>
#include <set>
#include <functional>
using namespace std;
int main()
{
set<int>s1={4,5,6,7};
s1.insert(2);
s1.insert(5);
set<int>::iterator it;
it=s1.find(4);// 返回set中值为x的迭代器 如果找不到x就返回end()
if(it!=s1.end()) cout<<1<<endl;
else cout<<0<<endl;//找到了输出结果为 1
int cnt=s1.count(5);//count 用来查找某个键值出现的次数(0或者1)
cout<<cnt<<endl;//输出结果为 1
cnt=s1.count(10);
cout<<cnt<<endl;//输出结果为 0
it=s1.lower_bound(5);//返回 set 中大于等于 x 的最小元素的迭代器
cout<<*it<<endl;//输出结果为 5
//如果找不到会返回 end() 的迭代器
it=s1.upper_bound(5);//返回 set 中大于 x 的最小元素的迭代器
cout<<*it<<endl;//输出结果为 6
}
```
- **删除元素**
```cpp
#include <iostream>
#include <set>
#include <functional>
using namespace std;
int main()
{
set<int>s1={4,5,6,7};
s1.insert(2);
s1.insert(5);
set<int>::iterator it;
s1.erase(7);//删除单个元素
for(it=s1.begin();it!=s1.end();it++)
cout<<*it<<' ';//输出结果为 2 4 5 6
cout<<endl;
s1.erase(s1.begin(),s1.find(5));//删除一个区间内的所有元素
for(it=s1.begin();it!=s1.end();it++)
cout<<*it<<' ';//输出结果为 5 6
cout<<endl;
s1.clear();//清空set中所有元素
cout<<s1.empty()<<endl;// 结果为1 说明为空
}
```
- **关于排序**
非结构体类型
```cpp
#include <iostream>
#include <set>
#include <functional>
using namespace std;
struct cmp
{
bool operator()(const int &a,const int &b)
{return a>b;}//降序
};
int main()
{
set<int>s1={4,5,6,7,1,3,9};
set<int>::iterator it;
for(it=s1.begin();it!=s1.end();it++)
cout<<*it<<' ';//set中默认升序 输出结果为 1 3 4 5 6 7 9
cout<<endl;
set<int,greater<int> >s;//实现降序排序
for(int i=5;i<=9;i++)
s.insert(i);
set<int>::iterator x;
for(x=s.begin();x!=s.end();x++)
cout<<*x<<' ';//输出结果为 9 8 7 6 5
cout<<endl;
set<int,cmp>s2={0,5,3,4,9,6};//通过构造实现降序排序
set<int,cmp>::iterator x1;
for(x1=s2.begin();x1!=s2.end();x1++)
cout<<*x1<<' ';//输出结果为 9 6 5 4 3 0
cout<<endl;
}
```
结构体类型
```cpp
#include <iostream>
#include <set>
#include <functional>
using namespace std;
struct sss
{
int a,b;
// 结构体插入set中 需要重载'<'运算符 从而实现降序排序
bool operator<(const sss &x)const
{
if(x.a==a) return b<x.b;
else return a>x.a;
}
};
int main()
{
set<sss>a;
set<sss>::iterator it;
sss x1={5,8};
sss x2={5,3};
sss x3={4,7};
sss x4={8,1};
a.insert(x1);a.insert(x2);a.insert(x3);a.insert(x4);
for(it=a.begin();it!=a.end();it++)
cout<<(*it).a<<' '<<(*it).b<<endl;//输出结果为 8,1 5,3 5,8 4,7
}
```
STL中常用容器及操作 学习笔记1的更多相关文章
- C++ STL 中 map 容器
C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...
- 【转】python 历险记(四)— python 中常用的 json 操作
[转]python 历险记(四)— python 中常用的 json 操作 目录 引言 基础知识 什么是 JSON? JSON 的语法 JSON 对象有哪些特点? JSON 数组有哪些特点? 什么是编 ...
- STL中的容器介绍
STL中的容器主要包括序列容器.关联容器.无序关联容器等. 一]序列容器 (1) vector vector 是数组的一种类表示,提供自动管理内存的功能,除非其他类型容器有更好满足程序的要求,否则,我 ...
- STL中的容器
STL中的容器 一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist ...
- 算法求解中的变量、数组与数据结构(STL 中的容器)
本质上算法都是对数据的操作,没有数据,没有存储数据的容器和组织方式,算法就是无源之水无本之木,就是巧妇也难为无米之炊.算法是演员,变量.数组.容器等就是舞台, 然后整个算法的处理流程,都是针对这些数据 ...
- C++ STL中常见容器的时间复杂度和比较和分析
C++ STL中常见容器的时间复杂度 map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种.不同操作的时间复杂度近似为: 插入: O( ...
- LoadRunner中常用的字符串操作函数
LoadRunner中常用的字符串操作函数有: strcpy(destination_string, source_string); strc ...
- [C++]STL中的容器
C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...
- MySQL4.0命令操作学习笔记
声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...
随机推荐
- zoj3905 Cake
Time Limit: 4 Seconds Memory Limit: 65536 KB Alice and Bob like eating cake very much. One day, ...
- 洛谷 P2391.白雪皑皑 (并查集,思维)
题意:有\(n\)个点,对这些点进行\(m\)次染色,第\(i\)次染色会把区间\((i*p+q)\ mod\ N+1\)和\((i*q+p)\ mod\ N+1\)之间的点染成颜色\(i\),问最后 ...
- C语言之库函数的模拟与使用
C语言之库函数的模拟与使用 在我们学习C语言的过程中,难免会遇到这样的一种情况: 我们通常实现一个功能的时候,费尽心血的写出来,却有着满满的错,这时却有人来告诉你说:这个功能可以用相应的库函数来实现. ...
- kubernetes实战-交付dubbo服务到k8s集群(一)准备工作
本次交付的服务架构图:因为zookeeper属于有状态服务,不建议将有状态服务,交付到k8s,如mysql,zk等. 首先部署zk集群:zk是java服务,需要依赖jdk,jdk请自行下载: 集群分布 ...
- codeforces 875B
B. Sorting the Coins time limit per test 1 second memory limit per test 512 megabytes input standard ...
- Python源码剖析——02虚拟机
<Python源码剖析>笔记 第七章:编译结果 1.大概过程 运行一个Python程序会经历以下几个步骤: 由解释器对源文件(.py)进行编译,得到字节码(.pyc文件) 然后由虚拟机按照 ...
- 1. mac 手动安装nodejs搭建vue环境
为什么选择手动安装nodejs呢? 因为使用mac自动安装还要更新homebrew,还要安装xcode tool, 太费劲了,不如手动安装, 卸载起来也方便 再一个, 我是后台开发者, 对前端页面, ...
- uni-app 实战-打包 📦 App
uni-app 实战-打包 App Android & iOS 证书 广告 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问 ...
- SCSS 复用 class 样式
SCSS 复用 class 样式 @mixin & @include 复用的变量名称,不可以是 .class 开头️ css-varibale-name .css-class-name Mix ...
- ruby & rvm
ruby & rvm https://rvm.io/ Ruby Version Manager (RVM) RVM is a command-line tool which allows yo ...