介绍
- 迭代器类似于指针类型,它也提供了对对象的间接访问。
- 指针是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 如果两个迭代器指示的是同一个元素或者它指向同一个容器的尾后迭代器,则相等.
迭代器的类型
拥有迭代器的标准库类型都是使用: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和常量指针一样,只可以读取但不可以修改所指的值。
为了便于得到const_iterator类型的返回值,引入两个新的函数,分别是cbegin和cend,功能类似于begin和end,只是返回的值类型为const_iterator;
迭代器的运算
iter+n //迭代器加上一个整数值仍得到一个迭代器,迭代器指示的新位置向前移动了,指示可能是容器的一个元素或者是尾部的下一个位置
iter-n //相反,迭代器指示的位置向后移动了,指示可能是容器的一个元素或者是尾部的下一个位置
iter1+=n //等价于iter1+n
iter1-=n //等价于iter2-n
iter1-iter2 //两个迭代器的距离,
可以对迭代器对象加上或减去一个整形值。这样做将产生一个新的迭代器,其位置在 iter 所指元素之前(加)或之后(减) n 个元素的位置。加或减之后的结果必须指向 iter 所指 vector 中的某个元素,或者是 vector 末端的后一个元素。加上或减去的值的类型应该是 vector 的 size_type 或 difference_type 类型,例子:
int main()
{
std::vector<int> ivec(10, 68);
print_int_vector(ivec);
int i = 0;
for (std::vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter, i++)
*iter = i; // set element to which iter refers to i
print_int_vector(ivec);
std::vector<int>::iterator iter = ivec.begin();
iter += 100;
std::cout<<*iter;
return 0;
}
本例子中ivec有10个元素,iter+=j,j在10以内都不会有错(0~9),大于等于10则会出现溢出问题,编译器,运行中间都不会报错!可以加当然可以减。
总而言之,迭代器就是一个队容器里元素操作的工具。
标签:容器,迭代,iterator,元素,iter,vector From: https://blog.51cto.com/u_15952369/6036941