您的位置:首页 > 编程语言 > C语言/C++

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里

#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;
}


输出结果为



本节流迭代器在加上文件流 操作起来还是比较有困难的,研究了下才搞明白,在网上也查看了不少资料。希望对你有用 这节代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: