迭代器算法2

插入迭代器:这类容器可与容器绑定在一起
实现在容器中插入元素的功能
iostream迭代器:这类容器可与输入或输出流绑定在一起,用于迭代器遍历。
反向迭代器:这类迭代器实现向后遍历,而不是向前遍历。所有容器类型都定义了自己的reverse_iterator类型。有rbegin和rend成员函数返回


back_iterator,创建使用push_back实现插入的迭代器。
front_inserter,使用push_front实现插入。
inserter,使用insert实现插入操作。除了所关联的容器外,inserter还带有第二实参:指向插入起始位置的迭代器


在vector或其他没有push_front运算的容器上使用front_inserter,将产生错误。


list<int>::iterator it=find(list.begin(),list.end(),42);
replace_copy(iver.begin(),iver.end(),inserter(list,it),100,0);


front_insert的使用将导致元素以相反的次序出现在目标对象中


iostream类型不是容器,但标准库同样提供了在iostream对象上使用的迭代器:istream_iterator用于读取输入流。而ostream_iteroator则用于写输出流。这些迭代器将它们所对应的流视为特定类型的元素序列。使用流迭代器时,可以用泛型算法从流对象中读数据(或将数据写到流对象中)。


istream_iterator<T> in(strm);创建从输入流strm中读取T类型对象的istream_iterator对象
istream_iterator<T> in;istream_iterator对象的超出末端迭代器
ostream_iterator<T> in(strm):创建T类型的对象写到输出流strm的ostream_iterator对象
ostream_iterator<T> in(strm,delim);创建将T类型的对象写到输出流strm的ostream_iterator对象,在写入过程中使用delim作为元素的分隔符,delim是一空格符结束的字符数组


创建流迭代器
istream_iterator<int> cin_it(cin);
istream_iterator<int> end_of_stream;
ofstream outfile;
ofstream_iterator<Sales_item>output(outfile," ");


反向迭代器
vector<int>::reverse_iterator r_iter;
for(r_iter = v.rbegin();r_iter!=v.rend();r_iter++)
{
cout<<*r_iter<<" ";
}


sort(v.begin(),v.end())//升序排列
sort(v.rbegin(),v.rend())//降序排列


反向迭代器与其他迭代器之间的关系
假设有一个名为line的string对象,存储以逗号分隔的单词列表。输出第一个单词和最后一个单词的程序
string::iterator comma = find(line.begin(),line.end(),',');
cout<<string(line.begin(),comma)<<endl;


string::reverse_iterator comma = find(line.rbegin(),line.rend(),',');


string::reverse_iterator rcomma = find(v.rbegin(),v.rend(),",");
    cout<<string(v.rbegin(),rcomma)<<endl;


    cout<<string(rcomma.base(),v.end());


五种迭代器种类
输入迭代器 读,不能写,只支持自增运算
输出迭代器 写,不能读,只支持自增运算
前向迭代器 读和写,只支持自增运算
双向迭代器 读和写,支持自增和自减运算
随机访问迭代器 读和写,支持完整的迭代器算术运算


map、set和list类型提供双向迭代器,而string、vector和deque容器上定义的迭代器都是随机访问迭代器,用于访问内置数组元素的指针也是随机访问迭代器。istream_iterator是输入迭代器,而ostream_iterator是输出迭代器


尽管map和set类型提供双向迭代器,但关联容器只能使用算法的一个子集。问题在于:关联容器的键是const对象。因此,关联容器不能使用任何写序列元素的算法。只能使用与关联容器绑在一起的迭代器来提供用于读操作的实参
在处理算法时,最好将关联容器上的迭代器视为支持自减原酸的输入迭代器,而不是完整的双向迭代器


向算法传递无效的迭代器类别所引起的错误,无法保证会在编译时被捕获到


泛型算法结构




算法大部分形式
alg(beg,end,other parms);
alg(beg,end,dest,other parms);
alg(beg,end,beg2,other parms);
alg(beg,end,bge2,end2,other parms);


sort(beg,end);
sort(beg,end,comp);
find(beg,end,val);
find_if(beg,end,pred);//查找一个是pred非零的元素
带有为此的算法后缀为_if;


无论算法时候检查它的元素值,都可能重新排列输入范围内的元素。在默认情况下,这些算法将重新排列的元素写回其输入范围。标准库也为这些算法提供另外命名的版本,将元素写到指定的输出目标。此版本在名字中添加了_copy后缀
reverse(beg,end);//将输入元素反射重新排列
reverse(beg,end,dest);//复制输出序列,并将它们逆序储存到dest开始的序列中


list容器特有的操作
list.merge(list2)
list.merge(list2,comp)
将list2的元素合并到list中。这两个list容器对象都必须排序,list2中的元素将被删除。合并后,list2为空。返回void类型。一个版本使用<操作符,第二个版本使用comp指定的比较运算


list.remove(val)
list.remove_if(unaryPred)
调用list.erase删除所有等于指定值或是指定的谓词函数返回非零值的元素。返回void类型


list.reverse()反响排列list中的元素


lst.sort()对list中的元素排序


list.splice(iter,list2)
list.splice(iter,lst2,iter2)
list.splice(iter,beg,end)
将list2的元素一道list中的迭代器iter指向的元素之前。在list2中删除移除的元素。第一个版本将list2的所有元素一道list中;合并后,list2为空。list和list2不能是同一个list对象。第二个版本之移动iter2所指向的元素,这个元素必须是list2中的元素。在这种情况下,list和list2可以是同一个list对系那个。也就是说,可在一个list对象中使用splice运算移动一个元素。第三个版本移动迭代器beg和end标记的范围内的元素。beg和end照例必须指定一个有效的范围。这两个迭代器可标记任意list对象内的范围,包括list。当他们指定list的一段范围时,如果iter也指向这个范围的一个原酸,则该运算未定义。
list.unique()
list.unique(binayPred)
调用erase删除同一个值的多个副本,第一个版本使用==操作符判断元素时候相等;第二个版本使用指定的谓语函数实现判断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值