任何一种容器都可以定义三种类别的迭代器
1、 container::iterator
这种迭代器可以以“读/写”模式遍历容器诸元素,并且自身可以改变,例如:
2、 container::const_iterator
这种迭代器只能以“读”模式遍历容器诸元素(元素值不可变),并且自身可以改变,例如:
for(vector<int>::const_iteratorciter=ivec.begin();citer!=ivec.end();citer++)
{ cout<<*citer; //ok(读)
*citer=3; //error(写)
}
因此,不妨将这种迭代器叫做“指向常量的迭代器”。
3、 constcontainer::iterator
这种迭代器可以以“读/写”模式遍历容器诸元素(元素值可变),但迭代器自身不可以改变,例如:
constvector<int>::iterator newiter=ivec.begin();
*newiter=11; //ok,可以修改指向容器的元素
newiter++; // error,这种迭迭代器本身不能被修改
因此,不妨将这种迭代器叫做“常迭代器”。
容器类别 | 支持的迭代器类别 |
vector | 随机访问迭代器 |
deque | 随机访问迭代器 |
list | 双向迭代器 |
set | 双向迭代器,元素为常量 |
multiset | 双向迭代器,元素为常量 |
map | 双向迭代器,key为常量 |
multimap | 双向迭代器,key为常量 |
stack | 容器适配器不支持迭代器 |
queue | 容器适配器不支持迭代器 |
priority_queue | 容器适配器不支持迭代器 |
迭代器的辅助函数
advance(p, n)的作用是让迭代器p前景或后退n个元素
distance(first, last)的作用是计算两个迭代器first和last之间的距离
Iter_swap(p1,p2)的作用是交换迭代器p1和p2所指数据元素的值
迭代器适配器
C++标准程序库提供了数个预先定义的特殊迭代器,称为迭代器适配器(Iterator Adapters)。如Insert Iterators(安插型迭代器)、Stream Iterators(流迭代器)、Reverse Iterators(逆向迭代器)。
Insert Iterators(安插型迭代器)可以使算法以插入(insert)方式而非覆盖(overwrite)方式动作。有三种安插型迭代器:back_inserter(安插于容器的最尾端)(只有deque、vector、list),front_inserter(安插于容器的最前端)只有deque和list,inserter它主要用于关联式容器。
Stream Iterators(流迭代器)流迭代器是一种迭代适配器,它们是类模板。由于它们独立于容器,所以使用时要包含头文件<iterator>。
vector<string> coll;
/*read all words from the standard input
* - source: all strings until end-of-file (or error)
* - destination: coll (inserting)
*/
copy(istream_iterator<string>(cin), // start of source
istream_iterator<string>(), // end of source
back_inserter(coll)); //destination
// sort elements
sort(coll.begin(), coll.end()); //对所有元素排序
/*print all elements without duplicates
* - source: coll
* - destination: standard output (with newline between elements)
*/
unique_copy(coll.begin(), coll.end(), // source
ostream_iterator<string>(cout,"\n")); // destination"\n"的作用是指元素之间的分隔符是换行(还可以是其它的分隔符,如“\t”或“ ”等)。
Reverse Iterators(逆向迭代器)reverse Iterators(逆向迭代器)的作用是以逆向方式进行所有操作,即将递增运算转换为递减运算,将递减运算转换为递增运算。所有容器都可以通过其成员函数rbegin()和rend()产生reverse Iterators。
vector<int> coll;
// insert elements from 1 to 9
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}
// print all element in reverse order
copy (coll.rbegin(), coll.rend(), // source
ostream_iterator<int>(cout," ")); // destination