STL之再探迭代器

插入迭代器

迭代器被绑定到一个容器上,可用来向容器插入元素。
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流。使用需要包含

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

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

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

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

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

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

解题代码

//#include 
#include 
#include 

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)<//输出最后一个单词
auto rcomma = find(line.crbegin(), line.crend(), ',');
cout<<string(rcomma.base(), line.cend())<

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

移动迭代器

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

你可能感兴趣的:(STL之再探迭代器)