STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一
系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室
工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有
list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指
的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以
使用现成的组件。STL是C++的一部分,因此不用安装额外的库文件。
STL的版本很多,常见的有HP STL、PJ STL、SGI STL等。
在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、
<functional>、<iterator>、<vector>、<list>、<map>、<memory.h>、<numeric>.
<queue>、<set>、<stack>和<utility>.
一、STL(vector)
1、序列式容器vector: 向量(vector) 连续存储的元素<vector>
vector 容器是 STL 中最常用的容器之一,它和array容器非常类似,都可以看做是对
C++普通数组的“升级版”。不同之处在于,array实现的是静态数组(容量固定的数组),
而vector实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector会动
态调整所占用的内存空间,整个过程无需人工干预。
vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就
可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长
一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。
2、【创建vector容器方式]
#include <iostream>
#include<vector>
using namespace std:
int main()
{
//创建了一个v1的空容器 数据类型是double
vector<double> v1;
//创建容器的时候,给他赋值,然后初始化了元素的个数
vector<int> v2{34,65,78,90,28,56,98,77,81,18}
//创建容器,指定了元素个数
vector<int> v3(50);
//创建vector容器,他拥有10个字符为“A”
vector<char> v4(10,'A');
//将v4赋给v5
vector<char> v5(v4);
//v6将会保存1,2
int a[] = {1,2,3};
vector<int> v6(a,a+2);
//v8将会保存1,2,3
vector<int> v7{1,2,3,4,5,6,7,8,9,10};
vector<int> v8(begin(v7),begin(v7)+3);
return 0;
}
实战练习
#include <iostream>
#include<vector>
using namespace std;
int main()
{
//定义一个空的vector容器
vector<char> vi;
//向容器添加S T L T E M P L A T E
vi.push_back('S');
vi.push_back('T');
vi.push_back('L');
vi.push_back('T');
vi.push_back('E');
//输出容器vi元素个数size()
cout<<"元素个数为:"<<vi.size()<<endl;
//迭代器实现输出所有元素
vector<char>::iterator it;
for (it = vi.begin(); it != vi.end(); it++)
cout << " " << *it;
cout << endl;
//遍历容器
for(auto int i = vi.begin();i<vi.end();i++)//auto自动返回迭代器类型,减少代码量
cout<<""<<*i<<"";
cout<<endl;
//插入元素到头部
vi.insert(vi.begin(),'v');//这里为什么不可以用双引号?欢迎评论
//插入元素到尾部
vi.insert(vi.end(),'I');
//输出首个元素
cout<<"输出vi容器首个元素为"<<vi.at(0)<<endl<<endl;
return 0;
}
3、 【vector容器包含的成员函数]
[直接对应官方网站查询即可]
http://www.cplusplus.com/reference/vector/vector/
二、STL(deque)
1、deque 是 double-ended queue 的缩写,又称双端队列容器。
前面已接触过vector容器,值得一提的是,deque容器和vecotr容器有很多相似之
处,比如:deque容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在
序列中间添加或删除元素。deque容器也可以根据需要修改自身的容量和大小。
和vector 不同的是,deque还擅长在序列头部添加或删除元素,所耗费的时间复杂度
也为常数阶O(1)。并且更重要的一点是,deque容器中存储元素并不能保证所有元素都存储到
连续的内存空间中。
当需要向序列两端频繁的添加或删除元素时,应首选deque容器。
2、【创建vector容器方式]
#include <iostream>
#include <deque>
using namespace std;
int main()
{
//创建deque容器,没有任何数据元素
deque<int> d1;
//创建deque容器,且有50个元素
deque<int> d2(50);
//创建deque容器,有9个元素,并进行初始化赋值为88
deque<int> d3(9,88);
//容器之间可以赋值
deque<int> d4(10);
deque<int> d5(d4);
return 0;
}
实战练习
#include <iostream>
#include <deque>
using namespace std;
int main()
{
//定义空的容器
deque<int> d1;
//向容器尾部插入数字
d1.push_back(10);
d1.push_back(20);
d1.push_back(30);
d1.push_back(40);
d1.push_back(50);
d1.push_back(60);
//输出d1元素个数
cout<<"输出d1元素个数:"<<d1.size<<endl;
//向d1容器头部添加元素
d1.push_front(888);
//输出容器所有元素值
cout<<"输出d1容器所有元素的值:"<<endl;
for(auto i = d1.begin();i<d1.end();i++)
cout<<""<<*i<<"";
cout<<endl;
//删除元素10(容器头部数据元素值)
d1.pop_front();
return 0;
}
三、STL(stack)
容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些
不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。
stack<T>容器适配器中的数据是以LIFO(后进先出)的方式组织的,这和自助餐馆中堆叠的盘子、箱
子中的一堆书类似。理论上的stack容器及其一些基本操作。只能访问stack顶部的元素;只有
在移除stack 顶部的元素后,才能访问下方的元素。
举例说明
// stack::swap
#include <iostream> // std::cout
#include <stack> // std::stack
using namespace std;
int main ()
{
//创建一个stack容器适配器
list<int>ls{10,20,30};
stack<int,list<int>>mystack(ls);
//查询mystack存储元素的个数
cout<<"mystack栈容器数据元素个数:"mystack.size()<<endl;
//输出栈容器元素的值:
while(!mystack.empty())//没有元素返回真,否则返回false
{
cout<<mystack.top()<<"";
//栈顶元素弹出去
mystack.pop();
}
std::stack<int> foo,bar;
foo.push (10); foo.push(20); foo.push(30);
bar.push (111); bar.push(222);
foo.swap(bar);
std::cout << "size of foo: " << foo.size() << '\n';
std::cout << "size of bar: " << bar.size() << '\n';
return 0;
}