迭代器的递增和递减有个奇怪的问题:一般而言你可以递增或递减暂时性迭代器,但对于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&