插入迭代器:
(1)back_inserter,创建一个使用push_back()的迭代器.
(2)front_inserter,创建一个使用push_front()的迭代器.
(3)inserter创建一个使用insert的迭代器.此函数接受第二个参数,一个指向给定容器的迭代器.元素将被插入到给定迭代器所表示的元素之前.
注意,容器必须支持相应操作才能够用相应的插入迭代器;
.
练习:用unique_copy将一个vector中不重复的元素拷贝到一个空的list中//unique_copy是标准库提供的算法.
vector<int> vec{ 1, 2,2,3, 3, 4, 5, 6, 7, 8, 9 };
list<int> lst;
unique_copy(vec.cbegin(), vec.cend(), inserter(lst,lst.begin()));
练习:将一个vector容器的数据拷贝到其它三个容器,分别用三个不同的插入迭代器.
vector<int> vec{ 1, 2,2,3, 3, 4, 5, 6, 7, 8, 9 },vec1,vec2;
list<int>lst;
copy(vec.cbegin(), vec.cend(),back_inserter(vec1));
print(vec1);
copy(vec.cbegin(), vec.cend(), inserter(vec2, vec2.begin()));
print(vec2);
copy(vec.cbegin(), vec.cend(), front_inserter(lst));
print(lst);
======================================================================================
流迭代器:
istream_iterator,ostream_iterator;流迭代器必须指定要读写的类型;
istream_iterator<string> in(cin);
istream_iterator<string> eof//尾后迭代器
ostream_iterator<string> out(cout);
ostream_iterator<string> out(os,d)//d是一个字符串,每次输出都会有d;
vector<string> vec(in,eof)//直接通过迭代器来构造vec.不需要编写循环
练习:用六迭代器文件读取内容保存到一个vector的string中.
ifstream in("Text.txt");//in绑定到Text;
istream_iterator<string> str_in(in);//迭代器str_in 绑定到流ifstream上
istream_iterator<string> eof;
S ves;
copy(str_in, eof, back_inserter(ves));
copy(ves.cbegin(), ves.cend(),ostream_iterator<string>(cout, "\n"));
return 0;
练习:使用迭代器从标准输入中读入数据,排序后写入标准输出.
istream_iterator<int> in(cin);
istream_iterator<int> eof;
vector<int> vec;
copy(in, eof, back_inserter(vec));
sort(vec.begin(), vec.end());
copy(vec.cbegin(),vec.cend(),ostream_iterator<int> (cout, " "));
return 0;
练习:通过流迭代器,accumulate,sort等算法重写书店程序,将相同isbn()码的纪录求和并输出结果.
int main()
{
istream_iterator<Sales_item> in(cin),eof;//输入数据
vector<Sales_item> vec(in, eof);
sort(vec.begin(), vec.end(), [](const Sales_item&s1,
const Sales_item&s2){return s1.isbn() < s2.isbn(); });//排序
Sales_item sum;
for (auto start = vec.begin(), newend = vec.end(); start != vec.end(); start = newend)
{
newend = find_if(start, vec.end(),
[start](const Sales_item & it){ return it.isbn()!=start->isbn();});//获取第一个不等的
cout<<start->isbn()<<" : "<< accumulate(start, newend,Sales_item())<<endl;
}
return 0;
}
练习:编写一个函数,读入三个文件名,从第一个读取数据,把奇数写入第一个文件,每个之间用空格隔开.偶数写入第二根文件,用换行隔开.
void func(const string& in_name, const string& odd_name,const string& even_name)
{
ifstream is_file(in_name);
ofstream os1(odd_name), os2(even_name);
istream_iterator<int> is(is_file), eof;
ostream_iterator<int> out1(os1, " "), out2(os2, "\n");
vector<int> vec;
copy(is, eof, back_inserter(vec));
for (auto element : vec)
(element % 2 ? out1 : out2) = element;
//另外一种写入方法
//for_each(is, eof, [&out1, &out2](const int i)
//{ ((i % 2) ? out1 : out2) = i; });
}
======================================================================================
反向迭代器:除了forward_list之外,其它容器都支持反向迭代器.++it,会移动到前一个元素.rebegin,rend,crbegin,crend;
sort(vec.rbegin(),vec.rend());//反向排序
练习:找到最后一个为0的元素.
vector<int>vec{ 1, 2,0, 3, 4, 5, 6, 7,0, 8, 9 };
auto it = find(vec.rbegin(), vec.rend(), 0);
cout << *it << endl;
把vector位置3到7之间的元素逆序拷贝.
vector<int>vec{ 1, 2,0, 3, 4, 5, 6, 7,0, 8, 9 };
list<int> lst(vec.rbegin()+3,vec.rend()-3);