STL: std::iterator_traits.

本文详细介绍了C++中五种迭代器的基本概念及其支持的操作,包括Output-iterator、Input-iterator、Forward-iterator、Bidirectional-iterator和Random-access-iterator。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Iterator(迭代器)是一种 "能够迭代某序列内所有元素"的对象,可通过改编自寻常pointer的一致接口来完成工作。

Iterator奉行一个纯抽象的概念: 任何东西,只要行为类似iterator,就是一种Iterator。但是不同的迭代器拥有不同的能力。

废话不多了说我们来了解一下迭代器的分类.

Output-iterator:

Output-iterator允许一步一步前行并搭配write动作.因此你可以通过Output-iterator对区间内的元素进行挨个赋值,但是不能使用Output-iterator对同一区间迭代2次.

其支持的操作:

*iter = val : 将val写到迭代器所指位置.

++iter : 向前步进,返回新位置(也可能只是个无用的操作,参考std::ostream_iterator).

iter++ : 向前步进,通常情况下返回旧位置(也可能只是个无用的操作,参考std::ostream_iterator).

标准库提供了std::ostream_iterator是典型的 Output-iterator!

 

           我们常用的所有迭代器都具有Input-iterator的能力,而且更强.

Input-iterator:

Input-iterator迭代器只能一次一个以前进方向读取元素,按此顺序一个个返回元素值。

其支持的操作:

*iter :  返回读取到的值.

iter->member : 返回读取的元素的成员.

++iter : 向前步进(返回新位置).

iter++ : 向前步进(发挥旧位置).

iter1 == iter2 : 判断2个迭代器是否相等.

iter1 != iter2 : 判断2个迭代器是否不相等.

TYPE(iter) : 拷贝构造函数.

其中标准库对于Input-iterator的 ==和!= 没有要求: 如果两个input-iterator都不是尾后迭代器,且指向不同位置,他们的比较结果会不相等.

其中标准库中的std::istream_iterator是典型的Input-iterator!

 

Forward-iterator:

Forward-iterator提供保证: 如果两个Forward-iterator都不是尾后迭代器,且指向不同的位置,它们的比较结果一定不会相等!

其支持的操作:

*iter : 返回读取到的值.

iter->member : 访问读取到的元素的成员(如果有的话).

++iter : 向前步进(返回新位置).

iter++ : 向前步进(返回旧位置).

iter1 == iter2 : 判断2个迭代器是否相等.

iter1 != iter2 : 判断2个迭代器时候不相等.

TYPE() : 通过默认构造函数创建一个迭代器.

TYPE(iter) : 迭代器的拷贝构造函数.

iter1 = iter2 : 迭代器的拷贝赋值运算符.

两个Forward-iterator如果指向同一个元素,调用 == 会得到true, 如果两者同时递增会再次指向同一个元素.

其中标准库中的std::forward_list是典型的提供了Forward-iterator的代表.

 

Bidirectional-iterator:

Bidirectional-iterator是在Forward_iterator的基础上增加了回头的能力.换句话来说,它支持递减操作,可以一步一步后退.

其支持的操作:

*iter : 返回读取到的值.

iter->member : 访问读取到的元素的成员(如果有的话).

++iter : 向前步进(返回新位置).

iter++ : 向前步进(返回旧位置).

iter1 == iter2 : 判断2个迭代器是否相等.

iter1 != iter2 : 判断2个迭代器时候不相等.

TYPE() : 通过默认构造函数创建一个迭代器.

TYPE(iter) : 迭代器的拷贝构造函数.

iter1 = iter2 : 迭代器的拷贝赋值运算符.

--iter : 步退返回新位置.

iter-- : 步退返回旧位置.

 

Random-access-iterator:

Random-access-iterator迭代器在Bidirectional-iterator的基础上增加了随机访问的能力。因此它必须提供iterator算术运算。

其支持的操作:

*iter : 返回读取到的值.

iter->member : 访问读取到的元素的成员(如果有的话).

++iter : 向前步进(返回新位置).

iter++ : 向前步进(返回旧位置).

iter1 == iter2 : 判断2个迭代器是否相等.

iter1 != iter2 : 判断2个迭代器时候不相等.

TYPE() : 通过默认构造函数创建一个迭代器.

TYPE(iter) : 迭代器的拷贝构造函数.

iter1 = iter2 : 迭代器的拷贝赋值运算符.

--iter : 步退返回新位置.

iter-- : 步退返回旧位置.

iter[n] : 访问索引位置为n的元素(针对寻常的 C-Style array).

iter+n : 将迭代器向前前进n个位置.

n+iter : 将迭代器向前前进n个位置.

iter - n: 将迭代器后退n个位置.

iter1 - iter2 : 返回2个迭代器之间的位置.

iter1 < iter2 : 判断iter1是否在iter2之前.

iter1 > iter2 :判断iter1是否在iter2之后.

iter1 <= iter2 :判断iter1是否不在iter2之后.

iter1 >= iter2 : 判断iter1是否不在iter2之前.

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/732540

(gdb) bt #0 0x005cd5ff in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6 #1 0x080e3b15 in std::_Rb_tree_iterator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, STDTM::AlarmElement> >::operator-- (this=0xbfbacdc4) at /usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_tree.h:199 #2 0x080e3873 in std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, STDTM::AlarmElement>, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, STDTM::AlarmElement> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, STDTM::AlarmElement> > >::_M_insert_unique (this=0x89b53a0, __v=...) at /usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_tree.h:1179 #3 0x080e31df in std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, STDTM::AlarmElement>, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, STDTM::AlarmElement> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, STDTM::AlarmElement> > >::_M_insert_unique_ (this=0x89b53a0, __position=..., __v=...) at /usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_tree.h:1217 #4 0x080e2ee7 in std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, STDTM::AlarmElement, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, STDTM::AlarmElement> > >::insert (this=0x89b53a0, __position=..., __x=...) at /usr/lib/gcc/i686-redhat-linux/4.4.7/../../../../include/c++/4.4.7/bits/stl_map.h:540
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值