STL介绍
STL标准模板库,由惠普实验室提供,里面集成了常用的数据结构类模板和算法函数模板等。
容器:用来存储各种类型数据的数据结构。
迭代器:类似于专门用来指向容器成员的指针,用来遍历、操作、管理容器中的成员,可以大大提高容器的访问速度。
算法:STL实现了常见的排序、查找算法。
List:双端链表容器
iterator:用来指向容器中的元素
begin() 获取指向第一个元素的迭代器
end() 获取指向最后一个元素的下一个位置
相关使用参考:https://blog.csdn.net/Ikaros_521/article/details/100091859
vector:向量容器,俗称数组
#include <iostream>
#include <vector>
using namespace std;
void show(vector<int>& arr)
{
for(int i=0; i<arr.size(); i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
// 创建向量,设置容量并初始化
vector<int> arr(12,0);
show(arr);
// 向量支持[]运算符,所以被称为数组
for(int i=0; i<10; i++)
{
arr[i] = i;
}
show(arr);
vector<int> arr1(10,0);
// 支持比较运算符
cout << (arr[0]==arr1[0]) << endl;
// at成员函数,相当于[]操作
for(int i=0; i<arr.size(); i++)
{
cout << arr.at(i) << " ";
}
cout << endl;
// 获取向量的容量
cout << arr.capacity() << endl;
}
stack、queue:栈和队列
double-ended queues:双端队列,用法与向量基本一致,但可以在头和尾快速插入和删除元素
#include <iostream>
#include <deque>
using namespace std;
int main()
{
deque<int> d(10,0);
for(int i=0; i<d.size(); i++)
{
d[i] = i;
}
for(int i=0; i<d.size(); i++)
{
cout << d[i] << " ";
}
cout << endl;
}
set:集合容器,集合中的数据会自动排序,不能重复(赋重复值也没用)。
#include <iostream>
#include <set>
using namespace std;
int main()
{
int arr[5] = {4,3,2,2,5};
set<int> s;
// 在集合中插入元素
s.insert(arr,arr+5);
set<int>::iterator it;
for(it=s.begin(); it!=s.end(); it++)
{
cout << *it << " ";
}
// 返回某个值元素的个数
cout << endl << s.count(2) <<" "<<s.count(1)<< endl;
// 返回指向大于(或等于)某值的第一个元素的迭代器
cout << *s.lower_bound(1) << endl;
}
map:是一种关联容器,在其他编程语言中叫字典,C++中叫映射,以key/value键值对的方式进行存储,key的值不能重复。
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> m;
// 插入元素
m.insert(make_pair(10010,"hehe"));
m.insert(make_pair(10011,"haaa"));
m.insert(make_pair(10012,"xixi"));
m.insert(make_pair(10013,"ohho"));
m.insert(make_pair(10013,"ohho"));
cout << m.size() << endl;
cout << (*m.find(10011)).second << endl;
map<int,string>::iterator it;
for(it=m.begin(); it!=m.end(); it++)
{
cout<< (*it).first << " " << (*it).second << endl;
}
}
multimap:多重映射,它与map很像,区别是它的key的值可以重复。
#include <iostream>
#include <map>
using namespace std;
int main()
{
multimap<int,string> mm;
// 插入元素
mm.insert(make_pair(10010,"ha1"));
mm.insert(make_pair(10012,"ha2"));
mm.insert(make_pair(10010,"ha3"));
mm.insert(make_pair(10013,"ha4"));
mm.insert(make_pair(10010,"ha5"));
cout << mm.size() << endl;
multimap<int,string>::iterator it;
// 查找一个元素
it = mm.find(10010);
// 返回指定元素出现的次数
for(int i=0; i<mm.count(10010); i++)
{
cout << (*it).second << endl;
it++;
}
}
multiset:多重集合,它与set很像,区别是它的值可以重复。
#include <iostream>
#include <set>
using namespace std;
int main()
{
int arr[10] = {1,3,5,3,2,5,7,6,3,9};
multiset<int> ms(arr,arr+10);
cout << ms.size() << endl;
cout << ms.count(3) << endl;
multiset<int>::iterator it;
for(it=ms.begin(); it!=ms.end(); it++)
{
cout << (*it) << " ";
}
}
priority_queue:优先队列,它会根据元素的比较结果进行排序。
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <queue>
using namespace std;
int com(int& a,int& b)
{
if(a > b)
return 1;
else if(a < b)
return -1;
else
return 0;
}
int main()
{
srand(time(NULL));
priority_queue<int> pq;
for(int i=0; i<10; i++)
{
int val = rand()%100;
cout << val << " ";
pq.push(val);
}
cout << pq.size() << endl;
while(!pq.empty())
{
cout << pq.top() << " ";
pq.pop();
}
}
总结:
1、vector和deque是支持[]运算,因此基本不需要迭代器,其他容器一律使用迭代器进行遍历。
2、stack、queue、priority_queue容器没有迭代器。
3、set、multiset、priority_queue会对元素进行排序,因它存储元素要支持比较运算符。