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

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;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值