c++ primer第五版(中文)习题答案 第十章第四节第二小节-iostream迭代器
2015-10-13 23:58
701 查看
本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。
本节主要学习迭代器iostream迭代器
学习笔记:
虽然iostream类型不是容器,但是标准库定义了可以用于这些io类对象的迭代器,istream_iterator 读取输入流,ostream_iterator向一个输出流写数据。这些迭代器将他们对应的流当作一个特定类型的元素寻列来处理。通过使用流迭代器,我们可以用泛型算法从流对象读取数据以及向其写入数据。
istream_iterator操作
当创建一个istream_iterator时,
1我们可以将它绑定到一个流
istream_iterator int_it(cin); //从cin读取int
2.可以默认初始化迭代器,就创建了一个可以当作尾后值使用迭代器。
istream_iterator int_eof ; //尾后迭代器
istream_iterator操作
istream_iterator in(is) ; // in从输入流is读取类型为T的值
istream_iterator end; //读取类型为T的值istream_iterator迭代器,表示尾后位置。
in1==in2 ; //in1和in2必须相同类型,如果他们都是尾
in1!=in2 ; // 后迭代器,或绑定到相同的输入,则两者相等
*in ; //返回从流中读取的值*
in->mem ; //与(*in).mem的的含义相同
++in ,in++; //使用元素类型定义的>>运算符从输入流中读取下一个值,前置版本返回指向递增后迭代器的引用,后置版本返回值。
ostream_iterator操作
istream_iterator out(os) ; // out将类型为T的值写入到输出流os中
istream_iterator out(os,d); //out将类型为T的值写到输出流中,每个后面都输出一个d,d指向一个空字符结尾的字符数组。
out=val ; //*用<<运算符将val写入到out所绑定的ostream中,val的类型必须与out可写类型兼容
*out ,++out ,out++; //都存在,但是不进行任何操作,返回out(因为这个特性,所以在循环中可以简写为 对out赋值。
习题解答:
10.29编写程序,使用迭代器读取一个文本文件,存入一个vector中string里
输出结果为
![](http://img.blog.csdn.net/20151013220457832)
10.30使用流迭代器 sort和copy从标准输入流读取一个整数序列,将其排序,并将结果写到标准输出。
输出结果为:
![](http://img.blog.csdn.net/20151013222929488)
10.31 修改前一程序,使其只打印不重复的元素,你的程序使用unique_copey;
输出结果为:
![](http://img.blog.csdn.net/20151013223724306)
10.32重写1.6节 中的书店程序,使用一个vector保存交易记录,使用不同算法完成处理,使用sort和10.3.1节的compareIsbn函数来排序交易记录,然后使用find和accumulate求和。
输出结果为:
![](http://img.blog.csdn.net/20151013231549398)
10.33编写程序,接受三个参数;一个输入文件和两个输出文件的文件名。输入文件保存的应该是整数。使用istream_iterator读取输入文件。使用ostream_iterator将奇数写入到第一个输出文件,每个值之后都跟一个空格,将偶数写入到第二个输出文件,每个值独占一行。
输出结果为
![](http://img.blog.csdn.net/20151013234750134)
本节流迭代器在加上文件流 操作起来还是比较有困难的,研究了下才搞明白,在网上也查看了不少资料。希望对你有用 这节代码。
本节主要学习迭代器iostream迭代器
学习笔记:
虽然iostream类型不是容器,但是标准库定义了可以用于这些io类对象的迭代器,istream_iterator 读取输入流,ostream_iterator向一个输出流写数据。这些迭代器将他们对应的流当作一个特定类型的元素寻列来处理。通过使用流迭代器,我们可以用泛型算法从流对象读取数据以及向其写入数据。
istream_iterator操作
当创建一个istream_iterator时,
1我们可以将它绑定到一个流
istream_iterator int_it(cin); //从cin读取int
2.可以默认初始化迭代器,就创建了一个可以当作尾后值使用迭代器。
istream_iterator int_eof ; //尾后迭代器
istream_iterator操作
istream_iterator in(is) ; // in从输入流is读取类型为T的值
istream_iterator end; //读取类型为T的值istream_iterator迭代器,表示尾后位置。
in1==in2 ; //in1和in2必须相同类型,如果他们都是尾
in1!=in2 ; // 后迭代器,或绑定到相同的输入,则两者相等
*in ; //返回从流中读取的值*
in->mem ; //与(*in).mem的的含义相同
++in ,in++; //使用元素类型定义的>>运算符从输入流中读取下一个值,前置版本返回指向递增后迭代器的引用,后置版本返回值。
ostream_iterator操作
istream_iterator out(os) ; // out将类型为T的值写入到输出流os中
istream_iterator out(os,d); //out将类型为T的值写到输出流中,每个后面都输出一个d,d指向一个空字符结尾的字符数组。
out=val ; //*用<<运算符将val写入到out所绑定的ostream中,val的类型必须与out可写类型兼容
*out ,++out ,out++; //都存在,但是不进行任何操作,返回out(因为这个特性,所以在循环中可以简写为 对out赋值。
习题解答:
10.29编写程序,使用迭代器读取一个文本文件,存入一个vector中string里
#include <iostream> #include <vector> #include <fstream> #include <string> int main() { //读取文本文件使用文件流 文本文件保存在和.cpp相同目录下名称10.29.txt std::ifstream ifs("10.29.txt"); //输入流,并定义尾后迭代器, std::istream_iterator<std::string> in(ifs),eof; std::vector<std::string> vec; //使用插入迭代器插入 std::copy(in, eof, back_inserter(vec)); //使用输出流输出 std::copy(vec.cbegin(), vec.cend(), std::ostream_iterator<std::string>(std::cout, "\n")); system("pause"); return 0; }
输出结果为
10.30使用流迭代器 sort和copy从标准输入流读取一个整数序列,将其排序,并将结果写到标准输出。
#include <iostream> #include <vector> #include <iterator> #include <algorithm> int main() { std::vector<int> vecInt; //定义一个输入迭代器int_iter;和尾迭代器 std::istream_iterator<int> int_iter(std::cin), eof; //循环输入数据到流中 while (int_iter!=eof) { //通过解引用,得到值 添加到vector中,输入迭代器向后移动 vecInt.push_back(*int_iter++); } //对vector中的数据进行排序 sort(vecInt.begin(), vecInt.end()); //吧vector中的数据拷贝到输出迭代器中,注意写法,没有out copy(vecInt.begin(), vecInt.end(), std::ostream_iterator<int> (std::cout, " ")); system("pause"); return 0; }
输出结果为:
10.31 修改前一程序,使其只打印不重复的元素,你的程序使用unique_copey;
#include<iostream> #include <iterator> #include <vector> #include <algorithm> int main() { std::istream_iterator<int> int_iter(std::cin), eof; std::vector<int>vecInt; std::ostream_iterator<int> out_iter(std::cout, ""); while (int_iter != eof) vecInt.push_back(*int_iter++); //在使用前一定要记得排序 sort(vecInt.begin(), vecInt.end()); unique_copy(vecInt.begin(), vecInt.end(), out_iter); system("pause"); return 0; }
输出结果为:
10.32重写1.6节 中的书店程序,使用一个vector保存交易记录,使用不同算法完成处理,使用sort和10.3.1节的compareIsbn函数来排序交易记录,然后使用find和accumulate求和。
#include <iostream> #include "Sales_item.h" //在作者提供的网址上下载 或者自己写, //因为我没看前面部分所以在作者网上找的 #include <vector> #include <iterator> #include <algorithm> #include <numeric> int main() { Sales_item total; std::vector<Sales_item> vecSales; std::istream_iterator<Sales_item> in_iter(std::cin), eof; std::ostream_iterator<Sales_item> out_iter(std::cout, ""); while (in_iter!=eof) vecSales.push_back(*in_iter++); //排序 sort(vecSales.begin(), vecSales.end(), [](Sales_item const& lhs, Sales_item const& rhs) { return lhs.isbn() < rhs.isbn(); }); //在排好序列的基础上合并 后面相同的,当遇到不想同的输出 for (auto beg = vecSales.cbegin(), end = beg; beg != vecSales.cend(); beg = end) { end = find_if(beg, vecSales.cend(), [beg](const Sales_item& item) { return item.isbn() != beg->isbn(); }); std::cout << std::accumulate(beg, end, Sales_item(beg->isbn())) << std::endl; } system("pause"); return 0; }
输出结果为:
10.33编写程序,接受三个参数;一个输入文件和两个输出文件的文件名。输入文件保存的应该是整数。使用istream_iterator读取输入文件。使用ostream_iterator将奇数写入到第一个输出文件,每个值之后都跟一个空格,将偶数写入到第二个输出文件,每个值独占一行。
#include <iostream> #include <vector> #include <fstream> #include <iterator> #include <algorithm> #include <numeric> //使用10.33.txt 里面保存的是1~9 每行一个 void readFile(std::ifstream &ifs, std::ofstream & ofs_odd, std::ofstream & ofs_even) { std::istream_iterator<int> in(ifs), in_eof; std::ostream_iterator<int> out_odd(ofs_odd, "\n"); std::ostream_iterator<int> out_even(ofs_even, "\n"); //遍历输入的数据 std::for_each(in, in_eof, [&out_odd, &out_even](const int i) { //与操作 因为偶数 最后一位为零,奇数最后一位为1说以能做与操作得到是奇数还是偶数。然后 输出流到文件输出流中 即可写入文件 *(i & 0x1 ? out_odd : out_even)++ = i; }); } int main() { std::ifstream infile("10.33.txt"); std::ofstream outfOne("10.34.1.txt"); std::ofstream outfTwo("10.34.2.txt"); readFile(infile, outfOne, outfTwo); system("pause"); return 0; }
输出结果为
本节流迭代器在加上文件流 操作起来还是比较有困难的,研究了下才搞明白,在网上也查看了不少资料。希望对你有用 这节代码。
相关文章推荐
- leetcode笔记:Binary Tree Preorder Traversal
- C语言基础知识
- 从C++文件中读取数据到vector的简捷方法
- C语言关于格式说明里包含回车
- c语言,把文件的所有内容读入到字符串中
- 用C语言输出9*9乘法表
- C++运算重载符
- 堆排序一
- c++课程感想5
- 堆排序二
- 37.3 大奖赛计分
- C++中关于string类型究竟能不能用cout输出的问题
- [C++] upper_bound和lower_bound
- c语言尾递归示例
- C++注意事项-----------删除,添加等操作可能会使当前迭代器失效
- ULBP(uniform LBP) c++代码
- POCO C++框架:Application
- C++中,将class转换成函数指针(运用运算符重载实现,即operator函数)
- Item 39:明智地使用private继承 Effective C++笔记
- 项目37.2 单位转换对照表