高效STL—迭代器 & 算法

每个标准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算法和同名的容器成员函数间进行选择时,你应该尽量使用成员函数。

时间: 2024-11-06 12:39:13

高效STL—迭代器 & 算法的相关文章

stl变易算法(二)

本篇接着前篇stl变易算法(一)继续讲述变易算法.主要介绍transform.replace.replace_if.replace_copy以及replace_copy_if的用法及实现代码,并给出测试用例. 元素变换transform transform算法用于实行容器元素的变换操作.如下两个使用原型,一个将迭代器区间[first,last)中元素,执行一元函数对象op操作,变换后的结果存放在[result,result+(last-first))区间中.另一个将迭代器区间[first1,la

STL迭代器笔记

STL迭代器简介 标准模板库(The Standard Template Library, STL)定义了五种迭代器.下面的图表画出了这几种: input         output \            / forward     |    bidirectional     |        random access 要注意,上面这图表并不是表明它们之间的继承关系:而只是描述了迭代器的种类和接口.处于图表下层的迭代器都是相对于处于图表上层迭代器的扩张集.例如:forward迭代器不但

stl变易算法(三)

本篇接着前面stl变易算法(一)和stl变易算法(二)继续讲述变易算法. 这里将介绍完余下的变易算法,主要有:填充fill.n次填充fill_n.随机生成元素generate.随机生成n个元素generate_n.移除复制remove_copy.条件移除复制remove_copy_if.移除remove.条件移除remove_if.不连续反复元素复制unique_copy.剔除连续反复元素unique.元素反向reverse.反向复制reverse_copy及旋转rotate .给出算法实现及实

STL 常用算法

1.      STL 常用算法 l  for_each() 例1 //普通函数 voidFuncShowElemt2(int &t) { cout << t << " "; } vector<int> v1; v1.push_back(1); v1.push_back(3); v1.push_back(5); //通过回调函数  谁使用for_each 谁去填写回调函数的入口地址 for_each(v1.begin(), v1.end(),

C++复习:STL之算法

算法 1算法基础 1.1算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较.交换.查找.遍历操作.复制.修改.反转.排序.合并等等. <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作. <functional>中则定义了一些模板类,用以声

STL基础--算法(排序)

STL排序算法 排序算法要求随机访问迭代器 vector, deque, container array, native array 例子 vector<int> vec = {9,1,10,2,45,3,90,4,9,5,8}; sort(vec.begin(), vec.end()); // 默认以 < 排序 // vec: 1 2 3 4 5 8 9 9 10 45 90 bool lsb_less(int x, int y) { return (x%10)<(y%10);

[C++ STL] 常用算法总结

1 概述 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象. 2 常用算法介绍 STL中算法大致分为四类: 非可变序列算法:指不直接修改其所操作的容器内容的算法. 可变序列算法:指可以修改它们所操作的容器内容的算法. 排序

【STL】帮你复习STL泛型算法 一

STL泛型算法 #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <numeric> #include <list> using std::cout; using std::endl; using std::vector; using std::list; bool IsOushu(const int&

初探STL之算法

算法 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象. 分类 STL中算法大致分为四类: 1.非可变序列算法:指不直接修改其所操作的容器内容的算法. 2.可变序列算法:指可以修改它们所操作的容器内容的算法. 3.排序算法