STL介绍
STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间了。STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。
STL组成构件
简单来说;
容器:类似数据结构,数组,链表,栈,队列等等。
算法:一些算法方式,一些排序算法,提供任何数据类型。
迭代器:将算法和容器进行链接。
STL 优点:高可重用性,高性能,高移植性,跨平台。
vector
图解:
介绍
它是单端数组,只能对该数组的一端进行插入和删除,他是一个动态数组,支持随机访问,存在自己的迭代器。
特点
vector 是动态数组,连续内存空间,具有随机存取效率高的优点。
vector 是单口容器,在队尾插入和删除元素效率高,在指定位置插入会导致数据元素移动,效率低。
应用例子
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
vector<int> v;
//插入元素10
for (int i = 0; i < 10;i++)
v.push_back(i);
//得到容器的迭代器
vector<int>::iterator it_begin = v.begin();
vector<int>::iterator it_end = v.end();
//遍历vector容器,将容器中的元素,输出
for (vector<int>::iterator it=v.begin(); it != v.end(); it++)
{
cout << *it << endl;
}
vector<int>v1(v);
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
cout << *it << endl;
}
cout << "v1.front():" << v1.front() << endl;
cout << "v1.back():" << v1.back() << endl;
cout << "v1[2]" << v1[2]<<endl;
return 0;
}
deque
图解:
介绍:
它可以理解为一个双端数组,这个数组的两端都可以插入和弹出,支持随机访问,有自己的迭代器。
特点
双端插入和删除元素效率较高.
指定位置插入也会导致数据元素移动,降低效率.
可随机存取,效率高.
应用例子
#include<iostream>
#include<deque>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
deque<int> q;
q.push_front(3);
q.push_back(5);
q.push_front(11);
for (deque<int>::iterator it = q.begin(); it != q.end(); it++)
{
cout << *it << endl;
}
cout <<"queue.at(2)"<<q.at(2) << endl;
cout << "queue.front()"<<q.front() << endl;
cout << "queue.back()"<<q.back() << endl;
cout << "q[1]" << q[1] << endl;
return 0;
}
stack
图解:
介绍:
stack 是一种先进后出(first in last out,FILO)的数据结构,它只有一个出口,stack 只允许在栈顶新增元素,移除元素,获得顶端元素,但是除了顶端之外,其他地方不允许存取元素,只有栈顶元素可以被外界使用,也就是说 stack 不能遍历,没有迭代器。
特点
栈不能遍历,不支持随机存取,只能通过 top 从栈顶获取和删除元素
应用例子
#include<iostream>
#include<stack>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
stack<int>s;
s.push(12);
s.push(15);
s.push(55);
cout << "s.size()" << s.size() << endl;
while (!s.empty())
{
cout << s.top() << endl;
s.pop();
}
cout << "s.size()" << s.size() << endl;
return 0;
}
queue
图解:
介绍:
queue 是一种先进先出(first in first out, FIFO)的数据类型,他有两个口,数据元素只能从一个口进,从另一个口出.队列只允许从队尾加入元素,队头删除元素,必须符合先进先出的原则,queue 和 stack 一样不具有遍历行为。
特定
必须从一个口数据元素入队,另一个口数据元素出队。
不能随机存取,不支持遍历
应用例子
#include<iostream>
#include<queue>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
queue<int> q;y
q.push(3);
q.push(6);
q.push(9);
while (!q.empty())
{
cout << q.front() << endl;
q.pop();
}
return 0;
}
list
图解:
介绍:
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
特点
采用动态存储分配,最大化利用内存
链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
链表灵活,但是空间和时间额外耗费较大
应用例子
#include<iostream>
#include<list>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
list<int> l;
l.push_front(12);
l.push_front(13);
l.push_front(33);
l.push_back(99);
for (list<int>::iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << endl;
}
cout << "l.size(3)=" << l.size() << endl;
cout << "l.front()=" << l.front() << endl;
cout << "l.back()=" << l.back() << endl;
return 0;
}
set
介绍:
借用平衡二叉树的结构,来实现对数据的自动排序,set 容器中不允许重复元素,multiset 允许重复元素。
应用例子
#include<set>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
set<int> s;
s.insert(11);
s.insert(1);
s.insert(22);
s.insert(66);
s.insert(88);
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << endl;
}
set<int>::iterator lo = s.lower_bound(22);//返回第一个 key>=keyElem 元素的迭代器。
set<int>::iterator up = s.upper_bound(22);//返回第一个 key>keyElem 元素的迭代器。
pair<set<int>::iterator ,set<int>::iterator> equal =s.equal_range(22);//返回容器中 key 与 keyElem 相等的上下限的两个迭代器。
cout <<"*lo=" <<*lo << endl;
cout << "*up=" << *up << endl;
cout <<"*(equal.first)="<<*(equal.first) << endl;
cout << "*(equal.second)=" << *(equal.second) << endl;
return 0;
}
map
介绍:
map 相对于 set 区别,map 具有键值和实值,所有元素根据键值自动排序。pair 的第一元素被称为键值,第二元素被称为实值。map 也是以红黑树为底层实现机制。map 和 multimap 区别在于,map 不允许相同 key 值存在,multimap 则允许相同key 值存在。
应用例子
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
map<int, int> m;
m.insert(make_pair(1,1));
m.insert(make_pair(2,2));
m.insert(make_pair(3,3));
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout <<"it->first="<<it->first<<" ";
cout << "it->second" << it->second << endl;
}
return 0;
}