插入迭代器
迭代器被绑定到一个容器上,可用来向容器插入元素。 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_iterator
的base
成员函数将其转化为普通的迭代器。rcomma和rcomma.base()指向不同的元素,但是它们位置相邻。
移动迭代器
这些专用的迭代器不是拷贝其中的元素,而是移动它们。