C++泛型算法的一些总结
泛型算法的一些总结
1、每个泛型算法的实现都独立于单独的容器,并且不依赖于容器存储的元素类型。
2、泛型算法从不直接添加或删除元素。
3、与容器的类型无关,只在一点上隐式地依赖元素类型:必须能够对元素做比较运算。
A、需要某种遍历集合的方式:能够从一个元素向前移到下一个元素。
B、必须能够知道是否到达了集合的末尾。
C、必须能够对容器中的每一个元素与被查找的元素进行比较。
D、需要一个类型来指示元素在容器中的位置,或者表示找不到该元素。
4、迭代器将算法和容器绑定起来。算法基于迭代器及其操作实现,而并非基于容器操作。
5、使用泛型算法必须包含algorithm头文件
6、通常泛型算法都是在标记容器(或其他序列)内的元素范围的迭代器上操作的,标记范围的两个实参类型必须精确匹配,而迭代器本身必须标记一个范围,第一个迭代器通过不断地处境,必须可以到到达第二个迭代器。
7、String标准库为string对象与char *对象定义了相等(==)操作符。
8、谓词(函数):是做某些检测的函数,返回用于条件判断的类型,指出条件是否成立。函数名可用于函数形参。
9、unique 的使用:该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器,表示无重复的值范围的结束。unique实际上并没有删除任何元素,而是将无重复的元素复制到序列的前端,返回的迭代器指向超出无重复无素范围末端的下一位置。注:由于该算法删除相邻的重复元素,所以在调用此函数之前,要调用sort函数进行排序。
10、关联容器的键是const对象,因此关联容器的迭代器视为支持自减远处的输入迭代器,而不是完整的双向迭代器。
11、泛型算法的结构:
A、通常有一对迭代器标记输入范围。
B、_if 版本的带有一个谓词函数开参,谓词函数用于表示所提供操作的要求,例如排序的规则。
C、_copy 版本多了一个绑定到容器元素类型相同(或可转换)的另一个容器,把一个容器的元素复制到绑定的容器中,并实现算法的操作,但对输入迭代器所标记的容器没有影响。
12、关于list 容器的特有算法。
list 容器上的迭代器是双向的,而不是随机访问类型。由于list 容器不支持随机访问,因此,在此窗口上不能使用使用需要随机访问迭代器的算法sort , 而merge, remove, reverse, unique 等性能也非常低。对于list 对象,应该优先使用list 容器特有的成员版本,而不是泛型算法。
list 特有的算法与其泛型算法版本之间有两个到头重要的差别,list容器特有的操作能添加和删除元素。
A、remove和 unique 的list版本修改了其关联的基础容器,真正地删除了指定的元素。
B、list容器提供的merge和splice运算会破坏它们的实参。使用merge 的泛型算法版本时,合并的序列将写入目标迭代器指向的对象,而它的两个输入序列保持不变。但是,使用list容器的merge成员函数时,则会破坏它的实参list对象,当实参对象的元素合并到调用merge函数的list对象时,实参对象的元素被移出并删除。