一
STL组件
容器(Container) - 管理某类对象的集合
迭代器(Iterator) - 在对象集合上进行遍历
算法(Algorithm) - 处理集合内的元素
容器适配器(container adaptor)
函数对象(functor)
STL容器的共同能力
所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指针。
所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素
STL容器的共同操作
初始化(initialization)
产生一个空容器
std::list
以另一个容器元素为初值完成初始化
td::list
…
std::vector
以数组元素为初值完成初始化
int array[]={2,4,6,1345};
…
std::set
在赋初值的时候原始数据一定要保存,以后还能用得到原始数据。
与大小相关的操作(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的大小(size)和容量(capacity)
size返回实际元素个数,
capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。
操作 |
效果 |
||
vector |
产生空的vector |
||
vector |
产生同类型的c1,并将复制c2的所有元素 |
||
vector |
利用类型T的默认构造函数和拷贝构造函数生成一个大小为n的vector |
||
vector |
产生一个大小为n的vector,每个元素都是e |
||
vector |
产生一个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 |
判断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
根据元素的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 |
判断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
#include
#include
using namespace std;
int main(){
vector
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
#include
#include
using namespace std;
int main(){
multimap
multimap
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
#include
#include
using namespace std;
int main()
{
vector
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
{
if(vv[i]==v)
{
vv.erase(vv.begin()+i);
for(int j=0;j
cout<
cout<
break;
}
}
}
return 0;
}
二 老师,我知道您能看出我这是粘贴的您的课件,可是这部分内容我真的不知道该怎么写,上周才刚理解了类的知识,以及运算符重载,这个stl我只是听懂了课堂知识,对于该怎么使用我还没掌握,我很想学会,可是总赶不上您的进度,我会继续努力的,