STL分为:vector、set、string、map、queue、priority_queue、stack、pair。
- vector翻译为向量,但在C++这里使用叫“变长数组(长度根据需要而自动改变的数组)”更合适。
1.定义:
vector<typename> name; //typename可以是 int、double、char 或者是结构体类型
如果typename也是一个STL容器,定义的时候在两个**>**之间加空格
例如:vector<vector<int> >name;
定义vector数组:
vector<typename> Arrayname[arraysize];
2.vector容器内元素的访问方式
a.通过下标访问:和访问普通数组一样
例如:
定义 :
vector<typename> vi
vi[index] //(如:vi[0]、vi[1])
b.通过迭代器访问:迭代器(iterator)类似于指针
vector<typename>::iterator it;
vector<int> vi; //定义一个int型的容器
for(int i = 0;i < 5;i++)
vi.push_back(i); //在vi的末尾添加元素i
vector<int>::iterator it = vi.begin(); //vi.begin()为取vi的首元素地址,it指向这个地址
for(int i = 0;i < 5;i++)
printf("%d ",*(it+i)); //输出vi[i] = *(vi.begin()+i)
//迭代器实现自加 ,vector的迭代器不支持it < vi.end()写法,所以循环只能写为it != vi.end(),vi.end()是取尾元素地址的下一个地址
for(vector<int>::iterator it = vi.begin();it != vi.end();it++)
printf("%d ",*it);
3.vector的基本操作
push_back(x); //在vector后面添加一个元素x
pop_back(); //删除vector的尾元素
size();//获取vector中元素的个数
clear();//清空vector中的所有元素
insert(it,x);//向vector的任意迭代器it处插入一个元素x
erase(it);//删除迭代器为it处的元素
erase(first,last);//删除区间[first,last)内的所有元素
- set翻译为集合,是一个内部自动有序且不含重复元素的容器。
1.定义:
set<typename> name;
set的定义和vector的定义一样,只需把vector改为set就行
2.set容器内元素的访问
set容器的访问只能通过迭代器访问,和vector差不多。
除了 vector和string之外的STL容器都**不支持(it+i)*的访问方式,所以只能以自加的方式进行枚举。
set<int> vi;
for(set<int>::iterator it = vi.begin();it != vi.end();it++)
printf("%d ",*it);
3.set的基本操作
insert(x)将x插入set容器中,并自动递增排序和去除重复的元素
find(value)返回set中对应值为value的迭代器
erase(it)删除迭代器为it处的元素
erase(first,last)删除区间[first,last)内的所有元素
size()获取set中元素的个数
clear()清空set中的所有元素
- string
1.定义:和定义普通类型一样
string str;
//对变量进行初始化
string str = "abcd";
2.string中内容的访问
a.通过下标访问:和访问普通字符串数组一样
string str = "abcd";
for(int i = 0;i < str.length();i++)
printf("%c",str[i]);
b.通过迭代器访问:
迭代器定义(与其他迭代器不同):string::iterator it;
vector和string之外的STL容器都支持*(it+i)的访问方式,也能以自加的方式进行枚举。
3.基本操作
+= 字符串拼接
length()/size();//返回string的长度,即存放的字符数。
insert(pos,string);//在pos号位置插入字符串string
insert(it,it2,it3);//it为原字符串的欲插入位置,it2和it3为待插字符串的首尾迭代器
如:
string str = "abcxyz",str2 = "opq";
str.insert(str.begin()+3,str2.begin(),str2.end());
substr(pos,len);//返回从pos号位开始,长度为len的字串
string::npos是一个常数,本身值为-1,但由于是unsigned_int型也可以认为是unsigned_int类型的最大值,用于find函数失配时的返回值
str.find(str2);//当str2是str的字串时,返回其在str中第一次出现的位置,如果不是就返回string::npos。
str.find(str2,pos);//从str的pos号位开始匹配str2,返回值与上相同
str.replace(pos,len,str2);//把str从pos号位开始、长度为len的字串替换为str2.
str.replace(it1,it2,str2);//把str的迭代器[it1,it2)范围的字串替换为str2.
- map翻译为映射
1.定义:
map<typename1,typename2> mp;
typename1为映射前类型(键key)
typename2为映射后类型(值value)
如果是字符串映射。必须使用string而不能使用char数组
map<string,int> mp;
map的键和值可以是STL容器
map<set<int>,string> mp;
2.map容器内元素的访问方式
**a.通过下标访问:**和访问普通数组一样
如:
map<char,int> mp;
mp['c'] = 20;
mp['c'] = 30; //20被覆盖,因为键值是唯一的
printf("%d\n",mp['c']); //打印出30
b.通过迭代器访问:
map<typename1,typename2>::iterator mp;
map<char,int> mp;
mp['m'] = 20;
mp['r'] = 30;
mp['a'] = 40;
for(map<char,int>::iterator it = mp.begin();it != mp.end();it++)
{
printf("%c %d\n",it->first,it->second);
}
// map会以键从小到大的顺序自动排序
3.基本操作
find(key);//返回键为key的映射的迭代器
size();//获取vector中元素的个数
clear();//清空vector中的所有元素
erase(it);//删除迭代器为it处的元素
erase(first,last);//删除区间[first,last)内的所有元素
- queue队列
1.定义
queue<typename> name;
2.访问
只能通过front()来访问队首元素,通过back()访问队尾元素
queue<int > q;
printf("%d %d",q.front(),q.back());
3.基本操作
push(x);//将x进行入队
front()或back()分别获得队首元素和队尾元素
pop();//令队首元素出队
empty();//判断queue是否为空
size();//返回queue内元素的个数
队列分为双端队列(dequeue)和优先队列(priority_queue)前者是首尾皆可插入和删除的队列,后者是使用堆实现的默认将当前队列最大元素置于队首的容器。
- priority_queue称为优先队列,底层用堆来实现。队首元素一定是当前队列中优先级最高的那一个。
1.定义
priority_queue<typename> name;
2.访问
优先队列没有front()和back()函数,只能通过top()函数来访问队首元素(堆顶元素)
3.基本操作
push(x);//将x进行入队
top();//获取队首元素
pop();//令队首元素出队
empty();//判断优先队列是否为空
size();//返回queue内元素的个数
4.priority_queue内元素优先级的设置
a.基本数据类型的优先级设置
priority_queue<int> q;
priority_queue<int,vector<int>,less<int> > q;//第三个参数表示数字大的优先级越大,如果换成greater<int>表示数字小的优先级越大,第二个参数表示承载底层数据结构堆的容器
b.结构体的优先级设置
struct fruit{
string name;
int price;
friend bool operator < (fruit f1,fruit f2) //重载大于号会编译错误
{
return f1.price > f2.price;
}
};
- stack栈
1.定义
stack<typename > name;
2.容器内元素的访问
由于栈本身就是一种后进先出的数据结构,只能通过top()函数来访问栈顶元素
3.基本操作
push(x);//将x进行入栈
top();//获取栈顶元素
pop();//令栈顶元素出队
empty();//判断栈是否为空
size();//返回栈内元素的个数
-
pair可以看作是内部有两个元素的结构体
struct pair {
typename1 first;
typename2 second;
};
1.定义
pair<typename1,typename2> name;
如果想在代码中临时构建一个pair,有如下两种方法:
- 将类型定义写在前面,后面小括号内两个元素的方式:
pair<string,int>("haha",5);
- 使用自带的make_pair函数
make_pair("haha",5);
2.访问
pair中只有两个元素,分别是first和second,按正常访问结构体的方式访问它即可