用迭代器实现二分查找&3.4.2练习(迭代器中.end()的注意事项)

来源:互联网 发布:淘宝要五星好评话术 编辑:程序博客网 时间:2024/05/22 08:25

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;elsecout << "已找到,所用次数为:" << 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;}



0 0
原创粉丝点击