每个标准STL容器提供了四种不容的迭代器:iterator、const_iterator、reverse_iterator和const_reverse_iterator。同时容器的insert和erase的某些形式只接受其中一种。
没有办法从const的迭代器转换为非const的迭代器,不能隐式转换也不能通过const_case转换。但是可以使用advance和distance来进行。
Advance(I,distance(I,ci));
//i是一个一般的iterator,ci是一个const_iterator
要得到与const_iterator指向同一位置的iterator,首先将iterator指向容器的起始位置,然后把它向前移到和const_iterator距离容器起始位置的偏移量一样的位置即可。这个任务得到了两个函数模板advance和distance的帮助,在<iterator>中声明。Distance返回两个指向同一容器的iterator之间的距离;advance则用于将一个iterator移动指定的距离。(在实际的调用中,可能需要显式的指明distance调用的模板参数类型,如何指定模板参数呢!)
对于reserve_iterator的成员函数可以产生“对应的”iterator。
要实现在一个reverse_iterator指出的位置上插入新元素,在ri.base()指向的位置插入就行了,对于insert操作而言,ri和ri.base()是等价的,而且ri.base()真的是ri对应的iterator。
要实现在一个reverse_iteratorri指出的位置上删除元素,就应该删除ri.base()的前一个元素。对于删除操作而言,ri和ri.base()并不等价,而且ri.base()不是ri对应的iterator.
同时要明白reserve_iterator的反向的迭代器,它的base()成员函数返回它右边的一个元素。
从容器中删除一个元素,remove类似的算法,要想从一个容器中删除一个元素,只能调用它的成员函数,因为remove无法知道它正在操作的容器,所以remove不可能从一个容器中除去元素。所以从一个容器中remove元素不会改变容器中元素的个数。如果在容器中想删除元素,那么在调用remove后需要调用erase函数。
有的算法是需要有序区间的:
不是所有算法可以用于任意区间,remove需要前向迭代器和可以通过这些迭代器赋值的能力。所以,它不能应用与由输入迭代器划分的区间,也不能是map或multimap。也不能是set和multiset的一些实现。很多排序算法需要随机访问迭代器,所以不可能在一个List的元素上调用这些算法。需要有序空间的一些算法有:
Binary_search lower_bound upper_bound equal_range set_union set_intersection set_diffence
Mem_fun和mem_fun_ref,只要你传递一个成员函数给STL组件,你就必须使用它们。
尽量使用成员函数代替同名的算法
有些容器拥有和STL算法同名的成员函数。关联容器提供了count find lower_bound upper_bound equal_range,而List提供了remove remove_if unique sort merge reverse
List成员函数的行为和它们的算法兄弟的行为经常不相同。如果你想从容器中清除对象的话,调用remove remove_if unique算法后,必须紧接着调用erase函数,但List的removeremove_if和unique成员函数真的去掉了元素,后面不需要接着调用erase。在sort算法和list的sort成员函数间的一个重要区别是前者不能用于List.作为单纯的双向迭代器,List的迭代器不能传给sort算法。Merge算法和list的merge成员函数之间也同样存在巨大的差异。当在STL算法和同名的容器成员函数间进行选择时,你应该尽量使用成员函数。