练习3.24:请使用迭代器重做3.3.3节(第94页)的最后一个练习。
练习3.25:3.3.3节(第93页)划分分数段的程序是使用下标运算符实现的,请利用迭代器改写程序并实现完全相同的功能。
练习3.26: 在100页的二分搜索中,为什么用的是mid = beg + (end - beg)/2,而非mid = (beg+end)/2;
答:练习3.24,3.25见云盘程序。
练习3.26,答:在日常生活中,我们习惯了以原点或者说是零点为参考点进行坐标的计算,在一维图中,即线段中,我们习惯把最左边的位置看成零点,但实际,假设我们在一个线段中标定,左右节点的位置,那我们对该段线段计算时就应该把左边的节点看成参考点,这才符合更一般的情况,beg是左侧参考点(相当于零点),end-beg是线段长度,因此mid= beg +(end - beg);
练习3.24-1
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int val;
vector<int> ivec;
while (cin >> val)
ivec.push_back(val);
for (auto it = ivec.begin(); it != ivec.end()-1; ++it)
//第一个实现相邻数字的相加
{
auto sum = *it + *(it + 1);
cout << sum << " ";
}
cout << endl;
return 0;
}
练习3.24-2
/*
*
*2015/5/21 重新把练习3-24第二个小题做了
*想清楚迭代器的结构,就不难了
*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int val;
vector<int> ivec;
vector<int> ivec2;
while (cin >> val)
ivec.push_back(val);
/*for (auto it = ivec.begin(); it != ivec.end(); ++it)
{
}*/
auto a = ivec.begin();
auto e = ivec.end()-1; //尾迭代器里面啥也没有,它的前一位是放的最后一个数
auto mid = a + (e-a)/2; //划定了中间的位置
while (a <= mid && e >= mid ) //在中间位置相遇时,迭代器停止运算。
{
auto sum = *a + *e;
ivec2.push_back(sum); //用新的迭代器来保存这个和
++a;
--e;
}
//ivec2.push_back(2*(*mid));
for (auto it = ivec2.begin(); it != ivec2.end(); ++it) //输出这个结果
cout << *it << " ";
cout << endl;
return 0;
}
/*
*
2015/5/21
练习3.25
*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
unsigned scores;
vector<unsigned> scoresTotal;
while (cin >> scores)
{
if (scores <= 100)
scoresTotal.push_back(scores);
}
vector<unsigned> grade(11,0);//grade里初始化11个数
auto it2 = grade.begin();
for (auto it = scoresTotal.begin(); it != scoresTotal.end(); ++it)
{
//auto n = *it /10; //对应的编号就是迭代器需要更新的位置,和下标运算等价。
//++*(it2+n); //在外部定义一个迭代器就行,改变的地方和标号对应就行,不要在里面写循环,那是错的,迭代器的位置更灵活,循环就限死了。
++*(it2 + (*it)/10); //合起来写,建议采用上面写法,便于理解和阅读
}
for (auto it = grade.begin(); it != grade.end(); ++it)
cout << *it <<" ";
cout << endl;
return 0;
}