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,将其拷贝到三个其他容器中。分别使用inserter
、back_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节中的去除重复单词的程序。
答: