迭代器的简介
- 迭代器类似于指针类型,它也提供了对对象的间接访问。
- 指针是c语言中就有的东西,迭代器是c++中才有的,指针用起来灵活高效,迭代器功能更丰富些。
- 迭代器提供一个对容器对象或者string对象的访问的方法,并且定义了容器范围。
使用迭代器
迭代器和指针不一样,容器和string有迭代器类型同时拥有返回迭代器的成员。比如,容器都有的成员begin和end,其中begin成员复制返回指向第一个元素(第一个字符)的迭代器,而end成员返回指向容器(或string对象)尾元素的下一个位置的迭代器,也就是说end指示的是一个不存在的元素,所以叫end返回的是尾后迭代器。一般我们清楚一个迭代器的准确类型是什么,所以我们都是使用auto或者decltype来定义变量的。
vector<int> v;
auto b=v.begin();
decltype(v.begin()) b=v.begin();
标准容器迭代器的运算符
*iter 返回迭代器iter所指元素的引用
iter->men 解引用iter并获得该元素的名为men的成员,相当于(*iter).men
++iter 令iter指示容器的下一个元素
--iter 令iter指示容器的上一个元素
iter1==iter2 如果两个迭代器指示的是同一个元素或者它指向同一个容器的尾后迭代器,则相等.
下面给出一个使用迭代器运算符修改容器元素的代码示例:
#include<iostream>
using namespace std;
#include<vector>
int main()
{
vector <int> v(10, 1);
int i=1;
cout << "未修改前:";
for (auto v_quote : v)
{
cout << v_quote << " " ; //未修改前
}
cout << endl;
for (auto v_quote = v.begin(); v_quote != v.end(); ++v_quote)
{
*v_quote += i;
++i;
}
cout << "修改后:";
for (auto v_quote : v)
{
cout << v_quote << " ";
}
cout << endl;
system("pause");
return 0;
}
迭代器的类型
那些拥有迭代器的标准库类型都是使用:iterator和const_iterator来表示迭代器的类型:
vector <int> ::iterator it; //it能读写vector<int>的元素
vector <int>::const_iterator it; //it只能读vector<int>的元素,不可以修改vector<int>中的元素
string::iterator s; //s可以读写string对象中的元素
string::const_iterator s; //s只可以读string对象中的元素,不可以修改string对象中的元素
const_iterator和常量指针一样,只可以读取但不可以修改所指的值。在c++11的新标准中,为了便于得到const_iterator类型的返回值,引入两个新的函数,分别是cbegin和cend,功能类似于begin和end,只是返回的值类型为const_iterator;
vector动态增长的限制:
- 不能再范围for循环中向vector对象添加元素。
- 任何一种可能改变vector容量的操作,比如push_back,都会使该vector对象的迭代器失效。
迭代器的运算
iter+n //迭代器加上一个整数值仍得到一个迭代器,迭代器指示的新位置向前移动了,指示可能是容器的一个元素或者是尾部的下一个位置
iter-n //相反,迭代器指示的位置向后移动了,指示可能是容器的一个元素或者是尾部的下一个位置
iter1+=n //等价于iter1+n
iter1-=n //等价于iter2-n
iter1-iter2 //两个迭代器的距离,
两个迭代器返回的值,在string和vector都为它定义了一个新的类型–difference_type,它是一个带符号的整型。
使用迭代器运算的一个经典算法是二分查找,代码如下:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
int main()
{
vector <int> v{ 1,20,10,5,6,7,90 };
cout << "请输入需要查找的值:";
int temp = 0;
cin >> temp;
sort(v.begin(), v.end()); //使用排序函数对容器vector中的元素进行排序
auto beg = v.begin();
auto end = v.end();
auto mid = v.begin()+ (end - beg) / 2;
/*
二分查找法:
每次都拿中间的那个值和需要查找的值做比较,如果相等就退出查找
如果查找的值比中间那个值小,则向前查找
如果查找的值比中间那个值大,则向后查找
*/
while (mid != end && * mid != temp)
{
if (temp < *mid)
{
end = mid;
}
else
{
beg = mid+1;
}
mid = beg + (end - beg) / 2;
}
if (* mid == temp)
cout << "find" << endl;
else
cout << "Not find" << endl;
system("pause");
return 0;
}
输出结果: