用迭代器实现二分查找&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
- 用迭代器实现二分查找&3.4.2练习(迭代器中.end()的注意事项)
- 二分查找的实现及注意事项
- 二分查找的注意事项
- 二分查找的一些注意事项
- 二分查找的实现
- 二分查找的实现
- 二分查找的实现
- 二分查找的实现
- 二分查找的实现
- 二分查找的实现
- 二分查找的实现
- 二分查找的实现
- 二分查找的实现
- 算法 二分查找的变种以及注意事项
- 二分查找法注意事项
- 二分查找法注意事项
- 快速排序和二分查找的练习
- 二分查找代码练习
- js判断时间是否大于当前时间
- 安装python 时出现no acceptable C compiler found in $PATH问题
- Navicat for MySQL过程中的错误
- 详谈内存管理技术(三)、线程模型
- Android 消息通知栏返回正在运行的Activity
- 用迭代器实现二分查找&3.4.2练习(迭代器中.end()的注意事项)
- 一个前端开发者的自我修养
- C# Lambda表达式详细总结
- elasticsearch安装教程,集群搭建及jdbc同步 elasticsearch安装 elastic-head安装
- 解决Fragment嵌套问题
- java 11:数组作为函数参数,数组做为函数返回值
- 显示地址小图,点击跳转百度地图
- king's trouble II SCU
- android动画简介