10.4 再探迭代器-插入/IO/反向
Posted liyubo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10.4 再探迭代器-插入/IO/反向相关的知识,希望对你有一定的参考价值。
10.4.1 插入迭代器
插入迭代器接受一个容器,生成一个迭代器,通过向该迭代器赋值可以实现向容器添加元素
(1)back_inserter:
接受一个参数,
示例:
auto iter = back_inserter(iVec);
iter = value;
(2)front_inserter:
接受一个参数,
示例:
auto iter = front_inserter(iVec);
iter = value;
(3)inserter:
接受两个参数,示例:auto iter = inserter(iVec, it); //it必须是一个指向iVec的迭代器,
iter = value; //将value插入到it之前
习题 10.28 三种插入迭代器的应用
int main() { int array[] = { 1,2,3,4,5,6 }; vector<int> iVec(begin(array), end(array)); vector<int> iVec_back; deque<int> iDeque_front; list<int> iList_inserter; copy(iVec.begin(), iVec.end(), back_inserter(iVec_back)); copy(iVec.begin(), iVec.end(), front_inserter(iDeque_front)); copy(iVec.begin(), iVec.end(), inserter(iList_inserter, iList_inserter.begin())); system("pause"); }
习题10.27
int main() { int array[] = { -2, 6, 1, 6, 5, -9, 4, -2, 8 }; vector<int> iVec(begin(array), end(array)); vector<int> iVecUnique; //元素排序,为拷贝不重复的元素做准备 stable_sort(iVec.begin(), iVec.end()); //拷贝不重复的元素到iVecUnique unique_copy(iVec.begin(), iVec.end(), back_inserter(iVecUnique)); system("pause"); }
10.4.2 iostream迭代器
主要目的是使用算法操作流迭代器。
习题10.30 标准流迭代器的应用
int main() { istream_iterator<int> in_ite(cin); //定义输入流迭代器,并绑定标准输入流 istream_iterator<int> in_end; //定义尾后迭代器,没有数据读入时迭代器就为尾后迭代器 ostream_iterator<int> out_iter(cout); //定义输出流迭代器,并绑定标准输出流 vector<int> iVec; copy(in_ite, in_end, back_inserter(iVec)); sort(iVec.begin(), iVec.end());//排序 copy(iVec.begin(), iVec.end(), out_iter);//输出到与 out_iter 绑定的标准输出设备 system("pause"); }
习题 10.29 使用流迭代器读取文件
int main() { ifstream ifstrm("h:\\1.txt"); //定义文件输入流 istream_iterator<string> in_iter(ifstrm); //定义IO类的输入迭代器,并绑定ifstrm istream_iterator<string> in_end; //定义尾后迭代器,没有数据读入时迭代器就为尾后迭代器 vector<string> strVec; copy(in_iter, in_end, back_inserter(strVec)); //利用copy算法将文件中的内容放到容器,以单词为组 system("pause"); }
10.4.3反向迭代器
//假定有一个名为 line 的string,保存着一个逗号分隔的单词列表,我们希望打印line中的第一个单词和最后一个单词,则分别用正向迭代器和逆向迭代器 int main() { string line = "first,middle,last"; auto comma = find(line.cbegin(), line.cend(), ‘,‘); //查找第一个逗号 cout << string(line.cbegin(), comma) << endl; //打印最后一个单词 auto rcomma = find(line.crbegin(), line.crend(), ‘,‘); //查找最后一个逗号 cout << string(line.crbegin(), rcomma) << endl; //错误,输出 tsal 是逆序的 //cout << string(rcomma, line.crbegin()) << endl; //错误,rcomma是一个逆向迭代器,而line.crbegin()返回尾后字符,所以会溢出 cout << string(rcomma.base(), line.end()) << endl; //正确,反向迭代器调用base()函数会返回普通迭代器,注意调用后指向不同的元素,会移动一位 system("pause"); }
以上是关于10.4 再探迭代器-插入/IO/反向的主要内容,如果未能解决你的问题,请参考以下文章