C++ Primer笔记( 3.4.2)—— 迭代器运算器
#include<iostream>
#include<vector>
#include<string>
using std::string;
using std::vector;
/**********************************************************************************************************/
/* vector和string迭代器支持的运算 */
/* */
/* iter + n ------ 迭代器加上一个整数值仍得到一个迭代器,迭代器指示的新位置与原来相比向前移 */
/* 动了诺干个元素。结果迭代器或者指示容器内的一个元素,或者指示容器尾元素的 */
/* 下一个位置。 */
/* iter - n ------ 迭代器减去一个整数值仍得到一个迭代器,迭代器指示的新位置与原来相比向后移 */
/* 动了诺干个元素。结果迭代器或者指示容器内的一个元素,或者指示容器尾元素的 */
/* 下一个位置。 */
/* iter1 += n ------ 迭代器加法的复合赋值语句,将iter1加n的结果赋给iter1 */
/* iter1 -= n ------ 迭代器减法的复合赋值语句,将iter1减n的结果赋给iter1 */
/* iter1 - iter2 ------ 两个迭代器相减的结果是它们之间的距离,也就是说,将运算符右侧的迭代器向前 */
/* 移动差值个元素后将得到左侧的迭代器。参与运算的两个迭代器必须指向的是同一 */
/* 个容器中的元素或者尾元素的下一个位置。 */
/* >、>=、<、<= ------ 迭代器的关系运算符,如果某迭代器指向的容器位置在另一个迭代器所指位置之前,*/
/* 则说前者小于后者。参与运算的两个迭代器必须指向的是同一个容器中的元素或者 */
/* 尾元素的下一个位置。 */
/**********************************************************************************************************/
int main()
{
/* ----- 迭代器的算术运算 ----- */
//举个例子,下面的代码得到一个迭代器,它指向某vector对象中间位置的元素;
vector<int> v = { 0,1,2,3,4,5,6,7,8,9 };
auto mid = v.begin() + v.size() / 2;
//v有10个元素,v.size()/2得5,此例中即令mid等于v.begin()+5。
/* ---------------------------- */
/* ----- 使用迭代器运算 ----- */
//下面的程序使用迭代器完成了二分搜索
//text必须是有序
vector<int> text = { 0,1,2,3,4,5,6,7,8,9 };
int sought = 7; //需要搜索的值
//beg和end表示我们搜索的范围
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg) / 2; //初始状态下的中间点
//当还有元素尚未检查并且我们还没有找到sought时执行循环
while (mid != end && *mid != sought)
{
if (sought < *mid) //我们要找到元素在前半部分吗?
end = mid; //如果是,调整搜索范围使得忽略掉后半部分
else //我们要找的元素在后半部分
beg = mid + 1; //在mid之后寻找
mid = beg + (end - beg) / 2; //新的中间点
}
/* -------------------------- */
return 0;
}