STL之再探迭代器

简介: 插入迭代器迭代器被绑定到一个容器上,可用来向容器插入元素。 back_inserter创建一个使用push_back的迭代器 front_inserter创建一个使用push_front的迭代器 inserter创建一个使用insert的迭代器,此函数接受哦第二个参数,这个参数必须是指向一个给定容器的迭代器。元素将被插入到给定迭代器所表示的元素之前。list&lt

插入迭代器

迭代器被绑定到一个容器上,可用来向容器插入元素。
back_inserter创建一个使用push_back的迭代器
front_inserter创建一个使用push_front的迭代器
inserter创建一个使用insert的迭代器,此函数接受哦第二个参数,这个参数必须是指向一个给定容器的迭代器。元素将被插入到给定迭代器所表示的元素之前。

list<int> lst = {1,2,3,4};
list<int> lst1, lst2; //空list
//拷贝完成之后,lst1包含4 3 2 1
copy(lst.begin(), lst.end(), front_inserter(lst1));
//拷贝完成之后,lst2包含1 2 3 4
//inserter和back_inserter不会使插入元素序列颠倒
copy(lst.begin(), lst.end(),inserter(lst2,lst2.begin()));

流迭代器

istream_iterator操作

迭代器被绑定到输入或输出流上,可用来遍历所关联的IO流。使用需要包含<iterator>

ifstream in("afile");
istream_iterator<string> str_it(in); //从"afile"读取数据

istream_iterator<int> in_iter(cin); //从cin读取int
istream_iterator<int> eof //默认初始化,生成istream尾后迭代器
while (in_iter != eof)
{
    vec.push_back(*in_iter++);
}

更妙的用法:

istream_iterator<int> in_iter(cin);
istream_iterator<int> eof;
vector<int> vec(in_iter, eof);

这个构造函数从cin中读取数据,直到遇到文件尾或者遇到一个不是int的数据为止。从流中读取的数据被用来构造vec。

ostream_iterator操作

两种构造函数:

//out将类型为T的值写入到输出流os中
ostream_iterator<T> out(os);
//out将类型为T的值写入到输出流os中,每个值后面都输出一个d
ostream_iterator<T> out(os, d);

使用ostream_iterator输出值的序列的三种方式:

ostream_iterator<int> out_iter(cout, " ");
for (auto& e : vec)
{
    *out_iter++ = e;
}
cout<<endl;

ostream_iterator<int> out_iter(cout, " ");
for (auto& e : vec)
{
    out_iter = e;
}
cout<<endl;

ostream_iterator<int> out_iter(cout, " ");
copy(vec.begin(), vec.end(), out_iter);

练习题
编写程序,接受三个参数,一个输入文件和两个输出文件的文件名。输入文件保存整数。使用istream_iterator读取输入文件,使用ostream_iterator将奇数写入第一个输出文件,每个值后面都跟一个空格;将偶数写入第二个输出文件,每个值都独占一行。

解题代码

//#include <iostream>
#include <fstream>
#include <iterator>

using namespace std;
int pro(const char* ch1, const char* ch2, const char* ch3);
int main()
{
    pro("in.txt", "out1.txt", "out2.txt");
}

int pro(const char* ch1, const char* ch2, const char* ch3)
{
    ifstream in(ch1);
    ofstream out1(ch2);
    ofstream out2(ch3);
    istream_iterator<int> in_iter(in), eof;
    ostream_iterator<int> out_iter1(out1, " ");
    ostream_iterator<int> out_iter2(out2, "\n");
    while (in_iter != eof)
    {
        if (*in_iter & 0x1)
        {
            //*out_iter1 = *in_iter++;
            *out_iter1++ = *in_iter++;
        }
        else
        {
            //*out_iter2 = *in_iter++;
            *out_iter2++ = *in_iter++;
        }
    }
}

反向迭代器

反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器。对于反向迭代器,递增和递减操作的含义会点到过来。除了forward_list之外,其他容器都支持反向迭代器。这些成员函数返回指向容器尾元素和首元素之前一个位置的迭代器。

可以通过向sort传递一对反向迭代器来将vector整理为递减序:

sort(vec.begin(), vec.end()); //正常排序vec,从小到大
sort(vec.rbegin(), vec.rend()); //逆序排序,从大到小

打印string对象中的单词:

string line = "one,two,three";
//输出第一个单词
auto comma = find(line.cbegin(), line.cend(), ',');
cout<<string(line.cbegin(), comma)<<endl;

//输出最后一个单词
auto rcomma = find(line.crbegin(), line.crend(), ',');
cout<<string(rcomma.base(), line.cend())<<endl;

可以调用reverse_iteratorbase成员函数将其转化为普通的迭代器。rcomma和rcomma.base()指向不同的元素,但是它们位置相邻。

移动迭代器

这些专用的迭代器不是拷贝其中的元素,而是移动它们。

目录
相关文章
|
2月前
|
存储 C++ 索引
当谈论迭代器时,我谈些什么?
当谈论迭代器时,我谈些什么?
38 1
|
3月前
|
算法 编译器 C++
|
5月前
|
算法 C++ 容器
STL迭代器
STL迭代器
26 0
|
2月前
|
存储 算法 C++
c++泛型算法(二)
c++泛型算法(二)
25 0
|
2月前
|
算法 编译器 C++
c++泛型算法(一)
c++泛型算法(一)
79 0
|
4月前
|
C++
【STL】:反向迭代器
【STL】:反向迭代器
26 0
|
8月前
|
存储 算法 搜索推荐
【C++】STL 算法汇总
C++ 标准模板库 Standard Template Library 算法汇总
68 1
|
12月前
|
算法 安全 关系型数据库
深入探究C++中的仿函数和迭代器——提升你的STL技能
作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段&gt;——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的 作者主页:热爱编程的小K 专栏链接:c++ 欢迎各位→点赞 + 收藏 + 留言​ 总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 ———————————————— 版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_72157449
|
12月前
|
存储 算法 程序员
C++STL学习笔记(第一篇:stl是什么?为什么要学习stl?迭代器在stl中扮演着什么角色?)
C++STL学习笔记(第一篇:stl是什么?为什么要学习stl?迭代器在stl中扮演着什么角色?)
256 0
|
12月前
|
C++ 容器
C++ STL学习之【反向迭代器】
适配器模式是 STL 中的重要组成部分,在上一篇文章中我们学习了 容器适配器 的相关知识,即 stack 与 queue,除了 容器适配器 外,还有 迭代器适配器,借助 迭代器适配器,可以轻松将各种容器中的普通迭代器转变为反向迭代器,这正是适配器的核心思想
150 0