迭代器与 STL 遍历
迭代器与 STL 遍历
目录
- Part 1:前置知识
- Part 2:概念简介
- Part 3:使用方法
- Part 4:实例解析
- Part 5:总结建议
Part 1:前置知识
部分 STL 容器的使用。例如 string、set、map、vector。
Part 2:概念简介
迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式,可在容器对象(container,例如链表或数组)上遍访的接口,设计人员无需关心容器对象的内存分配的实现细节。(——百度百科)
Part 3:使用方法
普通迭代器 iterator
以 string 为例,我们可以通过以下方式定义一个迭代器 it:
string s;
string::iterator it=s.begin();
这时候我们通过 * 字符取 it 指向的值,假设字符串 s 为 xiaomuyunAKIOI,那么 *it 就是字符 x。因为 s.begin() 指向的是 s 的开头。那 s.end() 是不是指向 s 的最后一个字符 I 呢?不,s.end() 指向的是 s 的最后一个字符的地址的后一位。也就是说,如果我们想要得到 s 的最后一个字符的话,我们要这么做:
xxxxxxxxxx
it=s.end();
--it;
这时,*it 就是字符 I 了。
反向迭代器 reverse_iterator
这个东西和上面的普通迭代器差不多,但是它的 begin() 不是普通的 begin(),而是 rbegin()。具体见下面的代码:
xxxxxxxxxx
string rs;
string::reverse_iterator rit=rs.rbegin();
这时 *it 是字符串 rs 的最后一个字符,并不是上面的 s.end()。不过当然,rs.rend() 是 rs 的第一个字符的地址的前一位。所以我们可以这样得到 rs 的第一个字符:
xxxxxxxxxx
rit=rs.rend();
--it;
这种方法在大部分(可能是全部)STL 容器中适用。
Part 4:实例解析
1. set 遍历
我们可以像刚才那样定义一个 iterator,然后 for 一遍即可。代码如下:
xxxxxxxxxx
set<int> s;
...;//输入一个数组并将数组加入到set里
for(set<int>::iterator it=s.begin();it!=s.end();++it){
...;//对于set中每个元素的处理
}
我们可以通过这个代码来测试 set 的单调性,或直接按照一个顺序输出里面的元素。我们还可以用 set 来去重。
2. erase()
许多 STL 容器都支持 erase() 函数。然而 erase() 中的参数是个 iterator,所以我们可以结合上面的知识来巧用 erase() 函数。
3. map 遍历和取值
像处理 set 一样,我们也可以遍历 map:
xxxxxxxxxx
map<int,int> m;
for(map<int,int>::iterator it=m.begin();it!=m.end();++it){
...;//处理
//这时,我们可以直接通过it->first来得到一个映射的key
//一样,我们可以直接通过it->second来得到一个映射的value
}
由于 map 也有单调性,所以我们也可以巧妙地运用它。
Part 5:总结建议
iterator 是一个值得我们探索的话题。让我们一起将 iterator 更加多地用于实践中吧!

浙公网安备 33010602011771号