STL总结之迭代器相关

本文详细介绍了C++ STL中迭代器的相关问题,包括为什么不能直接递增或递减vector的暂时性迭代器,以及解决方法。同时,文章探讨了迭代器的辅助函数如`advance()`、`distance()`和`iter_swap()`,并提醒了使用这些函数时需要注意的细节。此外,还讨论了逆向迭代器的使用,插入迭代器的区别以及如何通过`base()`将逆向迭代器转换为普通迭代器。最后,文章提到了流迭代器如`ostream_iterator`和`istream_iterator`的用法,并解释了迭代器特性的概念及其在泛型编程中的应用。
摘要由CSDN通过智能技术生成

迭代器的递增和递减有个奇怪的问题:一般而言你可以递增或递减暂时性迭代器,但对于vector和string就不行:

std::vector<int> coll;

if(coll.size() > 1) sort(++coll.begin(),coll.end()); // 会编译失败!但将vector换做deque就可通过,有时vector也可,这取决于其具体实作

这种奇怪问题的产生原因是:vector的迭代器通常被实作为一般指针。C++不允许你修改任何基本型别(包括指针)的暂时值,但对于struct和class则允许。不应该像上面那样使用vector,应该使用辅助对象:

if(coll.size() > 1){

std::vector<int>::iterator beg = coll.begin();

sort(++beg,coll.end());

}

迭代器相关辅助函数:

advance(),distance(),iter_swap().前二者(#include <iterator>)提供给所有迭代器一些原本只有随机存取迭代器才有的能力:前进/后退多个元素,及处理迭代器之间的距离。第三个辅助函数(#include <algorithm>)允许你交换两个迭代器的值。

1、#include <iterator>

void advance(InputIterator& pos,Dist n)   // 可令迭代器前进

注意:对于双向和随机存取迭代器而言,n可为负值;advance()并不检查迭代器是否超过序列的end()(迭代器通常不知道其所操作的容器,无从检查),所以,调用advance有可能导致未定义行为-对序列尾端调用operator++

2、#include <iterator>

Dist distance(InputIterator pos1,InputIterator pos2) //可处理两个迭代器之间的距离

注意:两个迭代器都必须指向同一个容器;若不是随机存取迭代器,则从pos1开始往前走必须能够到达pos2,即pos2位置必须与pos1相同或在其后;返回值Dist的型别由迭代器决定。对于非随机存取迭代器,distance性能并不好(线性),避免用它。当处理两个非随机存取迭代器之间的距离时,必须十分小心,如果不知道那个迭代器在前,必须先算出两个迭代器分别至容器起点的距离,再根据距离来判断。否则会导致未定义行为。

3、#include <algorithm>

void iter_swap(ForwardIterator1 pos1,ForwardIterator2 pos2)      //可交换两个迭代器所指内容

注意:迭代器旳型别不必相同,但其所指的两个值必须可以相互赋值;

eg: iter_swap(coll.begin(),++coll.begin())

// 如果以vector作为容器,一般情况下上面的无法运作,因为++coll.begin(),--coll.begin()得到的是暂时指针。

迭代器配接器:

1、逆向迭代器:

rbegin():传回最后一个元素的位置。

rend():传回第一个位置的前一个位置。

#include <iostream>

#include <vector>

#include <algorithm>

using namesapce std;

int main(){

vector<int> coll;

for(int i = 1; i <= 9; ++i){

coll.push_back(i);

}

vector<int>::iterator pos;

pos = find(coll.begin(),coll.end(),5);

cout<<"pos: "<<*pos<<endl;

vector<int>::reverse_iterator rpos(pos);

cout<<"rpos: "<<*rpos<<endl;

}

输出:pos: 5 

 rpos: 4

正常迭代器初始化向迭代器时,先减一,再解除引用,即为原来的值。反之,加一。

这种区间的半开性也有优点。如果你有个区间,由一双迭代器定义出来,那么变换操作就非常简单了,所有元素仍然有效:

#include <iostream>

#include <deque>

#include <algorithm>

using namespace std;

void  print(int elem){

cout<<elem<< ' ';

}

int main(){

deque<int> coll;

for(int i = 1; i <= 9; ++i){

coll.push_back(i);

}

deque<int>::iterator pos1;

pos1 = find(coll.begin(),coll.end(),2);

deque<int&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值