STL常见容器简介
vector 变长数组(数组长度动态变化,运用了倍增的思想)
1、size() 返回元素个数
2、empty() 判断是否为空
3、clear() 清空
4、front() 返回第一个数
5、back() 返回最后一个数
6、push_back() 在最后插入一个数
7、pop_back() 删除最后一个数
8、迭代器:
begin() vector 的第0个数 (相当于a[0])
end() vector 的最后一个数的后面一个数 (相当于a[a.size])
9、[] vector 支持随即寻址
10、支持比较运算 按字典来比
#include<iostream>
#include<csdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
//定义和初始化
vector<int> a;
//定义一个长度为10的vector a
vector<int> a(10);
//定义一个长度为10的vector a 并初始化为3
vector<int> a(10,3);
//定义含有10个vector 的vector 数组a
vector<int> a[10];
//返回元素个数
a.size();
//返回类型时bool 用于判断vector a是否为空
a.empty();
/*size() empty() 所有容器都有 且时间复杂度时O(1)*/
//清空
a.clear();
/*倍增思想:
当系统在为某一个程序分配空间时 所需要的时间基本上与
空间大小无关 主要与申请次数有关 所以要尽量减少申请空间的次数 (会造成空间浪费,用空间换时 间);
每一次数组长度不够的时候就把数组的长度乘以二 再把原来的原粗 copy 过来 平均每次插入一个 数O(1)的
*/
//三种遍历方式:
//1、运用下标遍历
for(int i=0;i<a.size();i++){
cout<<a[i]<<" "
}
cout<<endl;
//2、迭代器遍历
for(vector<int>::iterator i=a.begin();i!=a.end();i++) {
cout<<*i<<" ";
}
cout<<endl;
//3、范围遍历 auto 系统自动推断类型
for(auto x: a){
cout<<x<<" ";
}
cout<<endl;
//vector 比较:
vector<int> a(4,3),b(3,4);
if(a<b)
puts("a<b");
else
puts("a>b");
}
pair<int,int> 存储二元组 类型任意
1、first pair的第一个元素
2、second pair的第二个元素
3、支持比较运算,按照字典序排序,或者以first为第一关键字,以second为第二关键字排序
4、可以嵌套使用 例如:
pair<int ,pair<int ,int>> q; 这样就可以存储三个元素
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
//pair一般应用于存储某一个对象有两个不同(类型)的属性 (把需要排序的放在first)
//定义一个二元组,元素的类型可以任意
pair<int ,string> p;
//传入两个元素构造一个pair
q=make_pair(10,"cxy");
q={20,"cxy"};
//取pair的第一个元素
cout<<p.first<<endl;
//取pair的第二个元素
cout<<p.second<<endl;
//pair 可以嵌套使用
pair<int ,pair<int ,int> > q;//这样就可以存储三个元素
}
string 字符串 c++ 把字符串进行了封装
1、size() 返回元素个数
2、empty() 判断是否为空
3、claer() 清空字符串
4、可以通过"+"来实现在字符串末尾插入一串字符 或者 一个字符
5、sbustr(x,len) x表示字串起始的下标 len表示取字串的长度 当x+len大于总长度时就会输出到最后一个字符为止
当只输入一个参数x的时候 那么就会从下表为x开始到字符串的末尾
6、c_str() 返回字符数组的起始地址
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
string a;
//用加法实现字符串合并
a="cxy";
a+='2';
cout<<a<<endl;
a+="fhy";
cout<<a<<endl;
//从下标1开始取长度为2的字串输出
cout<<a.substr(1,2)<<endl;
//因为(1+20)>总长度所以只会输出到最后一个字符
cout<<a.substr(1,20)<<endl;
// 当只输入一个参数x的时候 那么就会从下表为x开始输出到字符串的末尾
cout<<a.substr(1)<<endl;
//当想用printf()输出一个string时 输出的时字符数组的其实地址
printf("%s\n",a.c_str());
}
queue 队列 先进先出
1、size() 返回元素个数
2、empty() 判断是否为空
3、front() 返回队首元素
4、push() 向队尾插入一个元素
5、back() 返回队尾元素
6、pop() 弹出队首元素
7、不支持claer() 如果想要清空则可以直接再次构造一次队列
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int main(){
int i,x;
//定义一个类型为int的队列 q
queue<int> q;
for(i=0;i<10;i++){
q.push(i);
}
for(i=0;i<10;i++){
x=q.front();
printf("%d\n",x);
q.pop();
}
//如果想要清空的话 则需要重新构造一下q
q=queue<int>();
cout<<q.empty()<<endl;
}
stack 栈
1、size()
2、empty()
3、push() 向栈顶插入一个元素
4、top() 返回栈顶元素
5、pop() 弹出栈顶元素
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
int main(){
stack<int> s;
for(int i=0;i<10;i++){
s.push(i);
}
x=s.size();
printf("%d\n",x);
cout<<s.empty()<<end;
for(i=0;i<10;i++){
int x;
x=s.top();
printf("%d ",x);
s.pop();
}
printf("\n");
cout<<s.empty()<<endl;
return 0;
}
set,multiset 基于平衡二叉树(红黑树) 动态的维护有序序列
1、set(集合)里面不能有重复元素(加入重复元素的时候该操作会被忽略)
multiset 里面可以有重复元素
2、size()
3、empty()
4、clear()
5、insert() 插入一个数
6、find() 查找一个数
7、count() 返回某个数的个数
8、erase()
(1)如果输入的是一个数x 则会删除所有值为x的数 O(k+logn)
(2)如果输入的是一个迭代器,则会删除这个迭代器
9、lower_bound(x) 返回大于等于x的最小的迭代器
uper_bound(x) 返回大于x的最小的迭代器
如果不存在则返回end()