c++ primer第五版(中文)习题答案 第十章第四节第二小节-iostream迭代器

本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。
本节主要学习迭代器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;
}

输出结果为
这里写图片描述

本节流迭代器在加上文件流 操作起来还是比较有困难的,研究了下才搞明白,在网上也查看了不少资料。希望对你有用 这节代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值