C++ Primer 学习笔记:泛型算法入门 插入迭代器 && iostream迭代器 && 反向迭代器

插入迭代器

插入迭代器(Insert Iterator),又叫插入器(Inserter),是继上次的反向迭代器之后C++中的又一个迭代器适配器。插入迭代器的主要功能为把一个赋值操作转换为把相应的值插入容器的操作。插入迭代器对标准算法库而言尤其重要。算法库对所有在容器上的操作有个承诺:决不修改容器的大小(不插入、不删除)。有了插入迭代器,既使得算法库可以通过迭代器对容器插入新的元素,又不违反这一承诺,即保持了设计上的一致性。
插入迭代器分为三种类型:尾部插入器(back_insert_iterator),首部插入器(front_insert_iterator)和普通插入器(insert_iterator)。第一种通过调用容器的push_back成员函数来插入元素,因此这种插入器只对vector,list,deque和string有效。 第二种通过调用容器的push_front成员函数来插入元素,因此它只对list和deque有效。第三种通过调用insert成员函数来插入元素,并由用户指定插入位置,它对所有标准的容器类型都有效,因为所有容器都定义了insert成员函数。对于普通的插入器,itr = value 等效于如下操作:

int main()  
{  
    vector<int> vecSrc;  
    list<int> vecDest;  

    for(vector<int>::size_type i=0; i<3; ++i)  
    {  
        vecSrc.push_back(i);  
    }  

    copy(vecSrc.begin(),vecSrc.end(),back_insert_iterator<list<int> >(vecDest));  
    PrintElements(vecDest);  
    cout<<endl;  

    copy(vecSrc.begin(),vecSrc.end(),front_insert_iterator<list<int> >(vecDest));  
    PrintElements(vecDest);  
    cout<<endl;  

    copy(vecSrc.begin(),vecSrc.end(),insert_iterator<list<int> >(vecDest,++vecDest.begin()));  
    PrintElements(vecDest);  

    return 0;  
}

iostream迭代器

流迭代器的定义。。任何已定义输入操作符(>>)的类型都可以定义istream_iterator。任何已定义输出操作符(<<)的类型也可定义ostream_iterator。在创建流迭代器时,必须指定迭代器所读写的对象类型

感觉不常用,所以直接网上搜索博客即可,这里不总结了

反向迭代器

反向迭代器是一种反向遍历容器的迭代器,也就是从最后一个元素到第一个元素遍历容器。反向迭代器将自增(自减)的含义反过来了。对于反向迭代器++运算访问前一个元素,而–运算则访问下一个元素。
所有容器都定义了begin和end成员。分别返回指向容器首元素和尾元素下一位置迭代器。容器还定义了rbegin和rend成员。分别返回指向容器尾元素和首元素前一位置的反向迭代器。
假设有一个vector容器对象,存储0—-9这10个升序排列的数字。。

vector<int> vec;
for(vector<int>::size_type i=0;i!=10;++i)
    vec.push_pack(i);

下面的for循环将以逆序输出这些元素

vector<int>::reverse_iterator r_iter;
for(r_iter=vec.rbegin();r_iter!=vec.rend();++r_iter)
    cout<<*r_iter<<endl;
为了降序排列vector只需向sort一对反向迭代器
sort(vec.begin(),vec.end());
sort(vec.rbegin(),vec.rend());

1、反向迭代器需要使用自减操作符。。

2、反向迭代器与其他迭代器之间的关系。
有一名为line的string对象。存储以逗号分隔的单词列表。我们希望输出line中的第一个单词。使用find可实现

string::igerator comma=find(line.begin(),line.end(),',');
cout<<string(line.begin(),comma)<<endl;

如果line中有一个逗号,则comma指向这个逗号,否则comma的值为line.end()。在输出string对象从line.begin()到comma的内容时,从头开始输出字符直到遇到逗号为止。如果string对象中没有逗号则输出整个string字符串。。
如果要输出列表最后一个单词,可使用反向迭代器

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

因为此时传递的是rbegin()和rend()这个函数用从line的最后一个字符开始往回搜索当find完成时,如果列表中有逗号,那么rcomma指向其最后一个逗号,即指向反向搜索找到的第一个逗号,如果没有逗号,则rcomma的值为line.rend()。在尝试输出所找到的单词时,

cout<<string(line.rbegin(),rcomma)<<endl;

如果输入是: FIRST,MIDDLE,LAST 则将输出TSAL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值