C++基础之迭代器iterator
2017-04-05 20:53
253 查看
C++基础之迭代器iterator
我们已经知道可以使用下标运算符来访问
string对象的字符或
vector对象的元素,还有另一种更通用的机制也可以实现同样的目的,这就是
迭代器(iterator)。
标准库容器都可以使用迭代器,但是只有少数几种才同时支持下标运算符。
类似于指针类型,
迭代器也提供了对
对象的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符。使用迭代器可以访问某一个元素,迭代器也能从一个元素移动到另外一个元素。迭代器和指针一样,有无效和有效的区别。
有效的迭代器指向元素或者尾元素的下一个位置,其他情况都属于无效的迭代器。
使用迭代器
能够使用迭代器的变量类型拥有返回迭代器的方法。
begin()方法负责返回指向第一个元素的迭代器
end()方法负责返回指向容器尾元素的下一个位置的迭代器
// b表示v的第一个元素,e表示v尾元素的下一个位置 auto b = v.begin(), e = v.end(); // b和e的类型相同
特殊情况下:
如果容器为空,则
begin和end返回的是同一个迭代器。
迭代器运算符
运算符 | 含义 |
---|---|
*iter | 返回迭代器iter所指元素的引用 |
iter->mem | 解引用iter并获取该元素的名为mem的成员,等价于*(iter).mem |
++iter | 令iter指向容器中的下一个元素 |
--iter | 令iter指向元素中的上一个元素 |
iter1 == iter2 | 判断两个迭代器是否相等 |
这使得迭代器就想下标一样的好用,比如:
string s("come thing"); if (s.begin() != s.end()) { auto it = s.begin(); *it = toupper(*it); }
迭代器类型
就想不知道
string和
vector的
site_type成员到底是什么类型一样,一般来说我们也不知道迭代器的精确类型。而实际上,那些拥有迭代器的标准库类型都会使用
iterator和
const_iterator来表示迭代器的类型:
vector<int>::iterator it; // it能代表vector<int>的元素 string::iterator it2; // it2能代表string对象中的元素 vector<int>::const_iterator it3; // it3只能代表读元素,不能代表写元素 string::const_iterator it4; // it4只能读字符,不能写字符,即改变字符的值
const_iterator和常量指针差不多,能读取但不能修改他所指元素的值。
如果vector对象或string对象是一个常量,只能使用
const_iterator
结合解引用和成员访问操作
解引用可以获得迭代器所指的对象,如果该对象的类型恰好是个类,就有可能进一步访问他的成员。例如:
vector<string> strs = {"string", "", "tingyugetc"}; for (auto it = strs.begin(); it != strs.end() ; ++it) { if (it->empty()) { cout << "now is in empty string" << endl; } }
上述的代码中使用了
箭头运算符, 箭头运算符将解引用和成员访问两个操作结合在一起,他的作用和
(*it).empty()相同。
(*it).empty()的圆括号必不可少,其含义是先执行括号内的解引用,接着解引用的结果在执行点运算符。如果不加括号,那么点运算符将由it执行,而不是it解引用的结果。
迭代器失效
某些对vector对象的操作会使迭代器失效.
谨记,但凡使用了迭代器的循环体,都不要想迭代器所属的容器添加元素
迭代器的运算
迭代器的递增运算令迭代器每次移动一个元素,所有的标准库都有支持递增运算符的迭代器。类似的,也能用
==和
!=对任意标准库类型的两个有效迭代器进行比较。
同样的,可以令迭代器和一个整数值相加或相减,其返回值是向前或向后移动了若干个位置的迭代器,执行这样的操作时,结果迭代器要么指向原vector对象内的一个元素要么指向尾元素的下一个位置。
比如,可以这样:
// 计算得到最接近vi中间元素的一个迭代器 auto mid = vi.begin() + vi.size() / 2;
使用迭代器运算的一个经典算法是二分搜索。
auto beg = text.begin(), end = text.end(); auto mid = beg + (end - beg) / 2; while (mid != end && *mid != found) { if (found < *mid) { end = mid; } else { beg = mid + 1; } mid = beg + (end - beg) / 2; }
相关文章推荐
- C++语法基础--泛型算法(generic algorithm)--反向迭代器,reverse_iterator::base()
- 标准C++中的Iterator(迭代器)简介
- c++ iterator(迭代器)分类及其使用
- 迭代器容器C++标准模板库 迭代器 iterator 详解(二)
- 从零开始学C++之STL(十):迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}
- 从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
- DEBUG C++ ——迭代器iterator的误用
- C++ - 正则表达式(regex) 迭代器(iterator) 的 详解 及 代码
- C++标准模板库 迭代器 iterator 详解(二)
- C++ - const 与 迭代器(iterator) 使用 详解
- 标准库类型基础(3)— 迭代器iterator
- c/c++:一个带迭代器的链表模板 iterator
- 结构型模式之迭代器(Iterator)与组合模式(Composite Pattern)C++实现******
- C++语法基础--泛型算法(generic algorithm)--插入迭代器back_inserter(),front_insertor(),inserter()以及next()函数简介
- c++学习笔记--C++Primer第4版--迭代器iterator
- C++Primer——迭代器iterator(1)
- C++设计模式之十六:Iterator 迭代器
- J2SE基础夯实系列之Iterator(迭代器)的一般用法 (转)
- C++ 迭代器, iterator
- C++ - const 与 迭代器(iterator) 使用 详解