1.用迭代器实现二分查找
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int cnt = 0;
vector < string >s1 {"a","b","c","d","e","f","g","h","i","j","k","l","m"};
auto beg = s1.begin(), end = s1.end();
auto mid = beg + (end - beg) / 2;//不能用(end+beg)/2,迭代器没有定义加法
while (mid != end&&*mid != "a")
{
if ("a" < *mid)
{
end = mid;
}
else
{
beg = mid;
}
mid = beg + (end - beg) / 2;
cnt++;
}
if (mid == end)
cout << "没找到目标" << endl;
else
cout << "已找到,所用次数为:" << cnt << endl;
system("pause");
return 0;
}
2.练习3.24
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<int> num;
int a = 0;
while (cin >> a)
num.push_back(a);//初始化num
decltype(num.size()) cnt = num.size();
auto beg = num.begin(),it1=num.end(), end = num.end();
//for (decltype(cnt) i = 0; i <(cnt / 2); i++)//注意:这个地方有一个隐式转换
// cout << " " << num[i] + num[cnt - 1 - i];
auto mid = beg + (end - beg) / 2;
if (beg == end)
{
cout << "输入的数据为空!" << endl;
return -1;
}
for (auto it = num.begin(); it != mid; it++)
{
it1--;
cout << " " << *it + *(it1);
}
cout << endl;
if (cnt % 2 != 0)
cout << "奇数个数其中间数字为:" << *mid << endl;
system("pause");
return 0;
}
在学习迭代器中,有很多要注意的地方。
1..end()该迭代器是该vetcor中最后一个元素的下一个元素的迭代,其值是不确定的。
要想令其指向最后一个元素,则应该num.end()-1,才可以得到。如代码上for循环里,首先对it1减1操作,得到最后一个元素。并且我们在调试时,可将for中设立一个断点查看:
f9设立断点 f5全速执行 f10单步执行
此时可以看到end和it1的值是不确定的数,即此时没有指向最后一个元素。
单步执行it--后,观察得到:
此时指向了最后一个元素 7。
2.对于auto mid = beg+(end-beg)/2 ,不能写成(beg+end)/2。因为对于两个迭代器之间是没有定义加法操作的,只有相减操作。并且end-beg的含义是end移动多长的距离才可追上beg,并且距离是difference_type类型的,即看做是一个带符号的整数。
那么我们把这个差值除以2,如果这个vector对象有奇数个元素,本代码中有7个,那么7除以2等于3.5,此时在加上beg,此时会发生一个隐式的转换,就是3.5+1=4。
对此我们应该尤为注意。
结果:
3.25
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<int> socres(11, 0);
int s = 0;
auto beg = socres.begin();
cout << "请输入小于等于100的数!" << endl;
while (cin >> s)
{
if (s <= 100)
++*(beg + s / 10);
}
for (auto disp : socres)
cout << disp << " ";
cout << endl;
system("pause");
return 0;
}