学习STL#2

迭代器类型·:输入,输出,正向,双向,随机访问

STL算法的接口是迭代器,而指针满足所有迭代器的要求,从而STL算法可以使用指针来对基于指针的非STL容器进行操作。例如数组,c++支持一个元素的越界,从而就可以超尾访问

copy(输入迭代器,输入迭代器,输出迭代器)。

//输入流的迭代器
#include<iterator>
ostream_iterator<int,char>out_iter(cout," ");
//第一个模板参数是发送给输出流的数据类型,第二个是输出流使用的
//第一个参数指出使用的输出流,也可以是文件的输出流。第二个参数是分隔符
copy(vec.begin(),vec.end(),out_inter);
//vec容器整个区间复制到输出流中

//istream输入也可以作为接口

输入流、输出流迭代器是迭代器概念的一个模型,他们把一些其他的接口转换为STL使用的接口

其他<iterator>预定义的迭代器

1.反向迭代器。reverse_interator,对其执行递增操作时将被递减,解除引用将先递减,再接触引用。函数rebegin()返回指向超尾的反向迭代器,rend()返回指向第一个元素的反向迭代器

2.三种插入迭代器。front_insert_iterator;back---;insert_iterator。将容器类型作为模板参数,将实际容器标识符作为构造函数参数

vector<int> hi;
back_insert_iterator<vector<int>> pt(hi)

 

容器概念

1.基本容器。要求可以创建对象,容器间赋值、比较是否相等、交换容器的值,迭代器至少是正向迭代器,begin,end,size。

2.序列。元素线性排列。用值或区间初始化,在特定位置插入值或区间,删除特定位置或区间。有部分可选要求,可以通过insert或者erase函数实现,但是在简化操作的情况下定义了新函数,部分新函数,例如a.push_front(t),vector未定义,但是这种操作是可以实现的。之所以这样是假定复杂度为固定时间才会被实现

(1)vector  数组,可反转容器,可随机访问。

(2)deque 双端队列,可以随机访问,实现和vector类似(中部插入和vector一样是线性时间)

(3)list 双向链表,可反转容器,不可随机访问。(矢量迭代器插入和删除后迭代器指向的元素可能变化,而链表不会变化)链表也有sort(),但是链表不可以使用非成员函数sort(),因为非成员函数的sort()要求指针可以随即访问。

(4)queue适配器类,底层deque,提供队列接口;stack适配器类,底层vector,提供栈接口

3.关联容器 x::value_type存储的值类型,x::key_type存储的键类型。关联容器不可以指定元素插入的位置,有确定元素放置位置的算法以便快速检索。

(1)set 值和键是相同的,键是唯一的。multiset可以多个值的键相同。所有set对象自动满足容器中的对象不相同且排序

//并集操作
ostream_iterator<string,char> ptr(cout," ") set_union(a.begin(),a.end(),b.begin(),b.end(),ptr); //也可以赋给另一个集合
/*关联集合将键看作常量,c.begin()返回的迭代器是常量迭代器,不能用作输出
使用插入迭代器*/
insert_iterator<set<string>> ptr(c,c.begin());
set_union(
a.begin(),a.end(),b.begin(),b.end(),ptr);

  lower_bound();upper_bound()

(2)map 值键类型不同,键唯一。

(3)multimap 数据项是按键排序的,并不需要指出插入位置

//把pair插入到multimap中
pair<const int,string> item(213,"hhh");
multimap<int,string>add;
add.insert(item)
//访问pair
item.first;item.second;
//获得multimap对象信息
auto range=codes.equal_range(111);
for(auto it=range.first;it!=range.second;it++)
//这里使用!=,是因为<符号不一定被定义

 

multimap对应同一键的数据是按输入事件排序的,不是排序的

 

posted @ 2021-03-14 10:22  Macondo's  阅读(50)  评论(0)    收藏  举报