C++Primer(第五版 )第十章 泛型算法 章节编程练习答案

10.2 重做上一题,但读取 string 序列存入 list 中。

答:count()接受一对迭代器和一个值作为参数。返回给定值在序列中出现的次数

10.4 假定 v 是一个vector<double>,那么调用 accumulate(v.cbegin(),v.cend(),0) 有何错误(如果存在的话)?

答:

10.6 编写程序,使用 fill_n 将一个序列中的 int 值都设置为0。

答:

10.7 下面程序是否有错误?如果有,请改正:

答:

  • (a) 应该加一条语句 vec.resize(lst.size()) 。copy时必须保证目标目的序列至少要包含与输入序列一样多的元素。
  • (b) 从语句上来说没错误,这段代码没有任何结果。但是从逻辑上来说,应该将 vec.reserve(10) 改为 vec.resize(10) 。

10.9 实现你自己的elimDups。分别在读取输入后、调用unique后以及调用erase后打印vector的内容。

答:

10.10 你认为算法不改变容器大小的原因是什么?

答:

  • 将算法和容器的成员函数区分开。
  • 算法的参数是迭代器,不是容器本身。

10.11 编写程序,使用 stable_sort 和 isShorter 将传递给你的 elimDups 版本的 vector 排序。打印 vector的内容,验证你的程序的正确性。

答:

10.13 标准库定义了名为 partition 的算法,它接受一个谓词,对容器内容进行划分,使得谓词为true 的值会排在容器的前半部分,而使得谓词为 false 的值会排在后半部分。算法返回一个迭代器,指向最后一个使谓词为 true 的元素之后的位置。编写函数,接受一个 string,返回一个 bool 值,指出 string 是否有5个或更多字符。使用此函数划分 words。打印出长度大于等于5的元素。

答:

10.14 编写一个lambda,接受两个int,返回它们的和。

答:

10.15 编写一个 lambda ,捕获它所在函数的 int,并接受一个 int参数。lambda 应该返回捕获的 int 和 int 参数的和。

答:

10.22 重写统计长度小于等于6的单词数量的程序,使用函数代替lambda

答:

10.23 bind 接受几个参数?

答:

假设被绑定的函数接受 n 个参数,那么bind 接受n + 1个参数。

10.24 给定一个string,使用 bind 和 check_size 在一个 int 的vector 中查找第一个大于string长度的值。

答:

10.26 解释三种插入迭代器的不同之处。

答:

  • back_inserter 使用 push_back 。
  • front_inserter 使用 push_front 。
  • inserter 使用 insert,此函数接受第二个参数,这个参数必须是一个指向给定容器的迭代器。元素将被插入到给定迭代器所表示的元素之前。

10.27 除了 unique 之外,标准库还定义了名为 unique_copy 的函数,它接受第三个迭代器,表示拷贝不重复元素的目的位置。编写一个程序,使用 unique_copy将一个vector中不重复的元素拷贝到一个初始化为空的list中。

答:

10.28 一个vector 中保存 1 到 9,将其拷贝到三个其他容器中。分别使用inserterback_inserter 和 front_inserter 将元素添加到三个容器中。对每种 inserter,估计输出序列是怎样的,运行程序验证你的估计是否正确。

答:

前两种为正序,第三种为逆序,输出和预计一样。

10.29 编写程序,使用流迭代器读取一个文本文件,存入一个vector中的string里。

答:

10.30 使用流迭代器、sort 和 copy 从标准输入读取一个整数序列,将其排序,并将结果写到标准输出。

答:

10.31 修改前一题的程序,使其只打印不重复的元素。你的程序应该使用 unique_copy

答:

10.34 使用 reverse_iterator 逆序打印一个vector

答:

10.35 使用普通迭代器逆序打印一个vector

答:

注:vector的end指向的是尾元素的下一个

10.36 使用 find 在一个 int 的list 中查找最后一个值为0的元素。

答:

10.37 给定一个包含10 个元素的vector,将位置3到7之间的元素按逆序拷贝到一个list中。

答:

10.38 列出5个迭代器类别,以及每类迭代器所支持的操作。

答:

  • 输入迭代器 : ==,!=,++,*,->
  • 输出迭代器 : ++,*
  • 前向迭代器 : ==,!=,++,*,->
  • 双向迭代器 : ==,!=,++,--,*,->
  • 随机访问迭代器 : ==,!=,<,<=,>,>=,++,--,+,+=,-,-=,*,->,iter[n]==*(iter[n])

10.39 list 上的迭代器属于哪类?vector呢?

答:

  • list 上的迭代器是 双向迭代器
  • vector 上的迭代器是 随机访问迭代器

​​​​​​​10.40 你认为 copy 要求哪类迭代器?reverse 和 unique 呢?

答:

  • copy 需要两个输入迭代器,一个输出迭代器
  • reverse 需要双向迭代器
  • unique需要随机访问迭代器

​​​​​​​10.41 仅根据算法和参数的名字,描述下面每个标准库算法执行什么操作:

答:

  • replace 在迭代器范围内用新值替换所有原来的旧值。
  • replace_if 在迭代器范围内,满足谓词条件的元素用新值替换。
  • replace_copy 复制迭代器范围内的元素到目标迭代器位置,如果元素等于某个旧值,则用新值替换
  • replace_copy_if 复制迭代器范围内的元素到目标迭代器位置,满足谓词条件的元素用新值替换

10.42 使用 list 代替 vector 重新实现10.2.3节中的去除重复单词的程序。

答:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值