STL总结
一、容器概述
1、可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模版,分为三种:
(1)顺序容器:vector, deque,list
(2)关联容器:set, multiset, map, multimap
(3)容器适配器:stack, queue, priority_queue
2、对象被插入容器中时,被插入的是对象的一个复制品。放入容器的对象所属的类,往往还应该重载 == 和 < 运算符。
3、顺序容器
(1)vector 头文件 :动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。尾部增删
(2) deque 头文件 :双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成。两端增删
list 头文件 :双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取
4、关联容器
(1)元素是排序的
(2)插入任何元素,都按相应的排序规则来确定其位置
(3)在查找时具有非常好的性能
(4)通常以平衡二叉树方式实现,插入和检索的时间都是 O(log(N))
(5)set/multiset 头文件 :set 即集合。set中不允许相同元素,multiset中允许存在相同的元素。
(6)map/multimap 头文件
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> v; //一个存放int元素的数组,一开始里面没有元素
v.push_back(1); v.push_back(2); v.push_back(3);
v.push_back(4);
vector<int>::const_iterator i; //常量迭代器
for( i = v.begin();i != v.end();++i )
cout << * i << " ";
cout << endl;
vector<int>::reverse_iterator r; //反向迭代器
for( r = v.rbegin();r != v.rend();r++ )
cout << * r << " ";
cout << endl;
}
输出:
1 2 3 4
4 3 2 1
2、vector容器
模拟动态数组,随机访问
元素可以是任意类型,但必须具备赋值和拷贝能力。
遍历vector:
vector<int> v(10);
int i;
for(i = 0;i < v.size() ; i ++){
cout << v[i]; //根据下标随机访问
}
cout<<endl;
vector<int>::const_iterator x;
for( x = v.begin(); x != v.end ();++x)
cout << * x;
输出:
0000000000
0000000000
3、算法
STL中提供能在各种容器中通用的算法,比如查找,排序
(1)find() 顺序查找
在容器中查找一个元素,并返回一个指向该元素的迭代器
int array[10] = {10,20,30,40};
vector<int> v;
v.push_back(1); v.push_back(2);
v.push_back(3); v.push_back(4);
vector<int>::iterator p;
p = find(v.begin(),v.end(),3);
if( p != v.end())
cout << * p << endl;
p = find(v.begin()+1,v.end()-2,1);//区间查找
if( p != v.end())
cout << * p << endl;
输出:
3
3
三、map/multimap
使用平衡二叉树管理元素
元素包含两部分(key,value),key和value可以是任意类型
必须包含的头文件#include
template<class Key, class T, class Pred = less<Key>,class A = allocator<T> >
class multimap {
….
typedef pair<const Key, T> value_type;
…….
};
(1)multimap中的元素由 <关键字,值>组成,每个元素是一个pair对象,关键字就是first成员变量,其类型是Key。
(2)multimap 中允许多个元素的关键字相同。元素按照first成员变量从小到大
排列,缺省情况下用 less 定义关键字的“小于”关系。
例:求关键字等于某值的元素个数
typedef multimap<int,double,less<int> > m;
m pairs;
pairs.insert(m::value_type(15,2.7));
pairs.insert(m::value_type(15,99.3));
cout << pairs.count(15) << endl;
输出:
3
2、map
(1)声明
template<class Key, class T, class Pred = less<Key>,
class A = allocator<T> >
class map {
….
typedef pair<const Key, T> value_type;
…….
};
(2)map 中的元素都是pair模板类对象。关键字(first成员变量)各不相同。元素按照关键字从小到大排列,缺省情况下用 less,即“<” 定义“小于”
(3)map的[ ]成员函数,若pairs为map模版类的对象,pairs[key]返回对关键字等于key的元素的值(second成员变量)的引用。若没有关键字为key的元素,则会往pairs里插入一个关键字为key的元素,其值用无参构造函数初始化,并返回其值的引用.
find(key)返回键值等于key的第一个元素,找不到返回end。
lower_bound(key)返回键值大于等于key的第一个元素,upper_bound(key)返回键值大于key的第一个元素。用于区间查找
equal_range(key)返回键值等于key的元素区间。
四、set/multiset
使用平衡二叉树管理元素
集合(Set)是一种包含已排序对象的关联容器
必须包含的头文件#include
1、multiset的定义:
template<class Key, class Pred = less,
class A = allocator >
class multiset { …… };
(1)Pred类型的变量决定了multiset 中的元素,“一个比另一个小”是怎么定义的。multiset运行过程中,比较两个元素x,y的大小的做法,就是生成一个 Pred类型的变量,假定为 m,若表达式m(x,y) 返回值为true,则 x比y小。
(2)Pred的缺省类型是 less
2、multiset 的成员函数
(1)iterator find(const T & val);在容器中查找值为val的元素,返回其迭代器。如果找不到,返回end()。
(2)iterator insert(const T & val); 将val插入到容器中并返回其迭代器。
(3)void insert( iterator first,iterator last); 将区间[first,last)插入容器。
(4)int count(const T & val); 统计有多少个元素的值和val相等。
(5)iterator lower_bound(const T & val);查找一个最大的位置 it,使得[begin(),it) 中所有的元素都比 val 小。
(6)iterator upper_bound(const T & val);查找一个最小的位置 it,使得[it,end()) 中所有的元素都比 val 大。
(7)pair<iterator,iterator> equal_range(const T & val);同时求得lower_bound和upper_bound。
(8)iterator erase(iterator it);删除it指向的元素,返回其后面的元素的迭代器
3、用法
multiset a;就等价于multiset<A, less> a;插入元素时,multiset会将被插入元素和已有元素进行比较。
set排序方式有两种:一个是使用重载的小于号,一个是使用函数对象。
4、set
1)set的定义:
template<class Key, class Pred = less,
class A = allocator >
class set { … }
(2)插入set中已有的元素时,忽略插入
(3)set中不允许有key相同的元素
#include <iostream>
#include <set>
using namespace std;
int main() {
typedef set<int>::iterator IT;
int a[5] = { 3,4,6,1,2 };
set<int> se(a,a+5); // 1 2 3 4 6
pair< IT,bool> result;
result = se.insert(5); // 变成 1 2 3 4 5 6
if( result.second ) //插入成功
cout << * result.first << endl;
return 0;
}
输出:
5
学习感受
STL通过模板编程,带来很多方便,要了解其功能实现的内部工作原理,让我们可以更好的使用。