一
STL组件
容器(Container) - 管理某类对象的集合
迭代器(Iterator) - 在对象集合上进行遍历
算法(Algorithm) - 处理集合内的元素
容器适配器(container adaptor)
函数对象(functor)
STL容器的共同能力
所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指针。
所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素
STL容器的共同操作
初始化(initialization)
产生一个空容器
std::list<int> l;
以另一个容器元素为初值完成初始化
td::list<int> l;
…
std::vector<float> c(l.begin(),l.end());
以数组元素为初值完成初始化
int array[]={2,4,6,1345};
…
std::set<int> c(array,array+sizeof(array)/sizeof(array[0]));
在赋初值的时候原始数据一定要保存,以后还能用得到原始数据。
与大小相关的操作(size operator)
size()-返回当前容器的元素数量
empty()-判断容器是否为空
max_size()-返回容器能容纳的最大元素数量
与迭代器(iterator)相关的操作
begin()-返回一个迭代器,指向第一个元素
end()-返回一个迭代器,指向最后一个元素之后
rbegin()-返回一个逆向迭代器,指向逆向遍历的第一个元素
rend()-返回一个逆向迭代器,指向逆向遍历的最后一个元素之后
元素操作
insert(pos,e)-将元素e的拷贝安插于迭代器pos所指的位置
erase(beg,end)-移除[beg,end]区间内的所有元素
clear()-移除所有元素
容器:
vector模拟动态数组
vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
必须包含的头文件#include <vector>
vector支持随机存取
vector的大小(size)和容量(capacity)
size返回实际元素个数,
capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。
操作 | 效果 | ||
vector<T> c | 产生空的vector | ||
vector<T> c1(c2) | 产生同类型的c1,并将复制c2的所有元素 | ||
vector<T> c(n) | 利用类型T的默认构造函数和拷贝构造函数生成一个大小为n的vector | ||
vector<T> c(n,e) | 产生一个大小为n的vector,每个元素都是e | ||
vector<T> c(beg,end) | 产生一个vector,以区间[beg,end]为元素初值 | ||
操作 | 效果 | ||
c.size() | 返回元素个数 | ||
c.empty() | 判断容器是否为空 | ||
c.max_size() | 返回元素最大可能数量(固定值) | ||
c.capacity() | 返回重新分配空间前可容纳的最大元素数量 | ||
c.reserve(n) | 扩大容量为n | ||
c1==c2 | 判断c1是否等于c2 | ||
c1!=c2 | 判断c1是否不等于c2 | ||
c1<c2 | 判断c1是否小于c2 | ||
c1>c2 | 判断c1是否大于c2 | ||
c1<=c2 | 判断c1是否大于等于c2 | ||
c1>=c2 | 判断c1是否小于等于c2 |
操作 | 效果 |
begin() | 返回一个迭代器,指向第一个元素 |
end() | 返回一个迭代器,指向最后一个元素之后 |
rbegin() | 返回一个逆向迭代器,指向逆向遍历的第一个元素 |
rend() | 返回一个逆向迭代器,指向逆向遍历的最后一个元素 |
map/multimap
使用平衡二叉树管理元素
元素包含两部分(key,value),key和value可以是任意类型
必须包含的头文件#include <map>
根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢
不能直接改变元素的key,可以通过operator []直接存取元素值
map中不允许key相同的元素,multimap允许key相同的元素
操作 | 效果 | ||||||
产生空的map | |||||||
map c1(c2) | 产生同类型的c1,并复制c2的所有元素 | ||||||
map c(op) | 以op为排序准则产生一个空的map | ||||||
map c(beg,end) | 以区间[beg,end]内的元素产生一个map | ||||||
map c(beg,end,op) | 以op为排序准则,以区间[beg,end]内的元素产生一个map | ||||||
~ map() | 销毁所有元素并释放内存。 | ||||||
操作 | 效果 | ||||||
c.size() | 返回元素个数 | ||||||
c.empty() | 判断容器是否为空 | ||||||
c.max_size() | 返回元素最大可能数量 | ||||||
c1==c2 | 判断c1是否等于c2 | ||||||
c1!=c2 | 判断c1是否不等于c2 | ||||||
c1<c2 | 判断c1是否小于c2 | ||||||
c1>c2 | 判断c1是否大于c2 | ||||||
c1<=c2 | 判断c1是否大于等于c2 | ||||||
c1>=c2 | 判断c1是否小于等于c2 | ||||||
操作 | 效果 | ||||||
c1 = c2 | 将c2的全部元素赋值给c1 | ||||||
c1.swap(c2) | 将c1和c2的元素互换 | ||||||
swap(c1,c2) | 同上,全局函数 | ||||||
操作 | 效果 | ||||||
count(key) | 返回”键值等于key”的元素个数 | ||||||
find(key) | 返回”键值等于key”的第一个元素,找不到返回end | ||||||
lower_bound(key) | 返回”键值大于等于key”的第一个元素 | ||||||
upper_bound(key) | 返回”键值大于key”的第一个元素 | ||||||
equal_range(key) | 返回”键值等于key”的元素区间 |
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
vector<int> a;
for (int i = 0; i < 5; ++i){
a.push_back(5 - i);
}
cout << "Size: " << a.size() << endl;
a.pop_back();
a[0] = 1;
cout << "Size: " << a.size() << endl;
for (int i = 0; i < (int)a.size(); ++i){
cout << a[i] << ", " << endl;
}
cout << endl;
sort(a.begin(), a.end());
cout << "Size: " << a.size() << endl;
for (int i = 0; i < (int)a.size(); ++i){
cout << a[i] << ", " << endl;
}
cout << endl;
a.clear();
cout << "Size: " << a.size() << endl;
return 0;
}
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main(){
multimap<string, int> mm1;
multimap<string, int>::iterator mm1i, p1, p2;
mm1.insert(make_pair("b", 3));
mm1.insert(make_pair("a", 0));
mm1.insert(make_pair("b", 5));
mm1.insert(make_pair("c", 4));
mm1.insert(make_pair("b", 2));
cout << "Size: " << mm1.size() << endl;
for(mm1i = mm1.begin(); mm1i != mm1.end(); mm1i++){
cout << mm1i->first << ": " << mm1i->second << endl;
}
cout << "COUNT: " << mm1.count("b") << endl;
cout << "Bound: " << endl;
p1 = mm1.lower_bound("b");
p2 = mm1.upper_bound("b");
for(mm1i = p1; mm1i != p2; mm1i++){
cout << mm1i->first << ": " << mm1i->second << endl;
}
return 0;
}
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
vector <int> vv;
int v;
for(int i=0;i<8;i++)
vv.push_back(i%2);
while(vv.size()>0)
{
cin>>v;
for(int i=0;i<vv.size();i++)
{
if(vv[i]==v)
{
vv.erase(vv.begin()+i);
for(int j=0;j<vv.size();j++)
cout<<vv[j]<<' ';
cout<<endl;
break;
}
}
}
return 0;
}