STL8—泛型算法结构
来源:互联网 发布:js函数返回值 编辑:程序博客网 时间:2024/05/30 23:09
正如所有的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础。
算法最基本的性质是需要使用的迭代器种类。所有算法都指定了它的每个迭代器形参可使用的迭代器类型。比如,如果形参必须为随机访问迭代器则可提供vector或 deque类型的迭代器,或者提供指向数组的指针。而其他容器的迭代器不能用在这类算法上。
C++还提供了另外两种算法模式:一种模式由算法所带的形参定义;另一种模式则通过两种函数命名和重载的规范定义。
1、区别带有一个值或一个谓词函数参数的算法版本
很多算法通过检查其输入范围内的元素实现其功能。其中的大部分算法会提供第二个版本的函数,允许程序员提供比较或测试函数取代操作符(<或==)的使用。
- sort(beg,end);
- //带有一个额外的形参,表示用于元素排序的不同运算
- sort(beg,end,comp);
检查指定值的算法默认使用==操作符。系统为这类算法提供另外命名的(而非重载的)版本:
- find(beg,end,val);
- find_if(beg,end,pred);
带有谓词函数形参的算法,其名字带有一个_if后缀。其中,find_if算法用于查找一个使谓词函数pred返回非零值的元素。
List独立的算法
与其他顺序容器所支持的操作相比,标准库为list容器定义了更精细的操作集合,使它不必只依赖于泛型操作。其中很大的一个原因就是list容器不是按照内存中的顺序进行布局的,不支持随即访问,这样,在list容器上就不能使用随即访问迭代器的算法,如sort等;还有其他的一些算法如:merge、remove、reverse和unique,虽然可以用在list上,但却付出了高昂的性能代价。因此标准库结合list的内部结构,编写出了更快算法:
list容器特有的操作
lst.merge(lst2)
lst.merge(lst2,comp)
将lst2的元素合并到lst中。这两个list容器对象都必须排序。lst2中的元素将被删除。合并后,lst2为空。返回void类型。第一个版本使用<操作符,而第二个版本则使用comp指定的比较运算
lst.remove(val)
lst.remove(unaryPred)
调用lst.erase删除所有等于指定值或指定的谓词函数返回非零值的元素。返回void类型。
lst.reverse()
反向排列lst中的元素
lst.sort()
对lst中的元素排序
lst.splice(iter,lst2)
lst.splice(iter,lst2,iter2)
lst.splice(iter,beg,end)
将lst2的元素移到lst中迭代器iter指向的元素前面。
在lst2中删除移出的元素。
第一个版本将lst2的所有元素移到lst中;合并后,lst2为空。lst和lst2不能是同一个list对象。
第二个版本只移动iter2所指向的元素,这个元素必须是lst2中的元素。在这种情况中,lst和lst2可以是同一个list对象。也就是说,可在一个list对象中使用splice运算移动一个元素。
第三个版本移动迭代器 beg和end标记的范围内的元素。beg和end照例必须指定一个有效的范围。这两个迭代器可标记任意list对象内的范围,包括lst。当它们指定lst的一段范围时,如果iter也指向这个范围的一个元素,则该运算未定义。
lst.unique()
lst.unique(binaryPred)
调用erase删除同一个值的连续副本。第一个版本使用
==操作符判断元素是否相等;第二个版本则使用指定的谓词函数实现判断
【最佳实践】
对于list对象,应该优先使用list容器特有的成员版本,而不是泛型算法!
list容器特有的算法与其泛型算法版本之间的两个至关重要的差别。
1)、remove和 unique的 list版本修改了其关联的基础容器:真正删除了指定的元素。例如,list::unique将 list中第二个和后续重复的元素踢出了该容器。
与对应的泛型算法不同list容器特有的操作能添加和删除元素。
2)、list容器提供的merge和 splice运算会破坏它们的实参。使用 merge的泛型算法版本时,合并的序列将写入目标迭代器指向的对象,而它的两个输入序列保持不变。但是,使用list容器的 merge成员函数时,则会破坏它的实参list对象 –当实参对象的元素合并到调用 merge函数的list对象时,实参对象的元素被移出并删除。
- //P362 习题11.29
- bool GT4(const string &str)
- {
- return str.size() >= 4;
- }
- bool compLength(const string &s1,const string &s2)
- {
- return s1.size() < s2.size();
- }
- int main()
- {
- list<string> words;
- ifstream inFile("input");
- string str;
- while (inFile >> str)
- {
- words.push_back(str);
- }
- words.sort();
- words.unique();
- list<string>::size_type word_cnt = count_if(words.begin(),words.end(),GT4);
- cout << "Have " << word_cnt << " words more the 4 characters." << endl;
- words.sort(compLength);
- for (list<string>::iterator iter = words.begin(); iter != words.end(); ++iter)
- {
- cout << *iter << endl;
- }
- }
- STL8—泛型算法结构
- C++primer__泛型算法-泛型算法结构
- stl学习笔记之泛型算法的结构
- 【足迹C++primer】34、泛型算法结构
- 结构算法
- 结构算法
- 算法 结构
- 结构+算法
- 结构算法导论——图
- C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构
- 《C++ Primer》读书笔记第十章-2-再探迭代器 And 泛型算法结构
- 算法、结构应用
- 373算法结构
- java树形结构 算法
- java 算法结构----单链表
- 结构算法之道
- 算法复习--------------矩阵结构
- 算法之树形结构
- smali入门之packed_switch
- a'a'a
- hdu4758 Walk Through Squares (AC自动机+DP)
- drawable hdpi mdpi ldpi xhdpi
- data representation
- STL8—泛型算法结构
- 有限状态机(FSM)的Java 演示
- 用POI创建Excel文件及下载
- STL之set的基本使用
- Android中多层动态嵌套布局的实现
- bzoj3713 [PA2014]Iloczyn
- 数据挖掘(hadoop的mapReduce技术概念)
- 【Java】泛型
- 小黑小波比.实现button关闭窗体