STL实践与分析

--容器特有的算法

与其它顺序容器所支持的操作相比,标准库为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为空。lstlst2不能是同一个list对象。

第二个版本号仅仅移动iter2所指向的元素,这个元素必须是lst2中的元素。在这样的情况中,lstlst2能够是同一个list对象。也就是说,可在一个list对象中使用splice运算移动一个元素。

第三个版本号移动迭代器 begend标记的范围内的元素。begend照例必须指定一个有效的范围。这两个迭代器可标记随意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对象时,实參对象的元素被移出并删除。

  1. //P362 习题11.29
  2. bool GT4(const string &str)
  3. {
  4. return str.size() >= 4;
  5. }
  6.  
  7. bool compLength(const string &s1,const string &s2)
  8. {
  9. return s1.size() < s2.size();
  10. }
  11.  
  12. int main()
  13. {
  14. list<string> words;
  15. ifstream inFile("input");
  16.  
  17. string str;
  18. while (inFile >> str)
  19. {
  20. words.push_back(str);
  21. }
  22.  
  23. words.sort();
  24. words.unique();
  25.  
  26. list<string>::size_type word_cnt = count_if(words.begin(),words.end(),GT4);
  27.  
  28. cout << "Have " << word_cnt << " words more the 4 characters." << endl;
  29.  
  30. words.sort(compLength);
  31.  
  32. for (list<string>::iterator iter = words.begin(); iter != words.end(); ++iter)
  33. {
  34. cout << *iter << endl;
  35. }
  36. }

  1. //演示样例程序:并不实现什么功能,仅仅做演示之用
  2. #include <iostream>
  3. #include <list>
  4. #include <fstream>
  5. using namespace std;
  6.  
  7. bool comp(int a,int b)
  8. {
  9. return a > b;
  10. }
  11.  
  12. void printList(const list<int> &iList)
  13. {
  14. for (list<int>::const_iterator iter = iList.begin(); iter != iList.end(); ++iter)
  15. {
  16. cout << *iter << '\t';
  17. }
  18. cout << endl;
  19. }
  20.  
  21. list<int> iList1,iList2;
  22.  
  23. void printAll()
  24. {
  25. cout << "iList1: " << endl;
  26. printList(iList1);
  27. cout << "iList2: " << endl;
  28. printList(iList2);
  29. }
  30.  
  31. void initList(list<int> &iList)
  32. {
  33. for (list<int>::size_type i = 0; i != 20; ++i)
  34. {
  35. iList.push_back(i);
  36. }
  37. }
  38.  
  39. int main()
  40. {
  41.  
  42. for (list<int>::size_type i = 0; i != 20; ++i)
  43. {
  44. iList1.push_back(i);
  45. iList2.push_back(i + 10);
  46. }
  47. printAll();
  48.  
  49. iList1.merge(iList2,comp);
  50. printAll();
  51.  
  52. iList1.sort();
  53. initList(iList2);
  54. printAll();
  55.  
  56. iList1.unique();
  57. cout << "iList1" << endl;
  58. printList(iList1);
  59. }

C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法的更多相关文章

  1. C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构

    STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...

  2. C++ Primer 学习笔记_40_STL实践与分析(14)--概要、先来看看算法【上】

    STL实践与分析 --概述.初窥算法[上]     标准库容器定义的操作很少.并没有给容器加入大量的功能函数.而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是"泛型"的. ...

  3. C++ Primer 学习笔记_29_STL实践与分析(3) --操作步骤集装箱(下一个)

    STL实践与分析 --顺序容器的操作(下) 六.訪问元素 假设容器非空,那么容器类型的front和back成员将返回容器的第一个和最后一个元素的引用. [与begin和end的对照:] 1)begin ...

  4. C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)

    STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...

  5. C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)

    STL实践与分析 --map类型(上) 引: map是键-值对的集合. map类型通常能够理解为关联数组:能够通过使用键作为下标来获取一个值,正如内置数组类型一样:而关联的本质在于元素的值与某个特定的 ...

  6. C++ Primer 学习笔记_43_STL实践与分析(17)--再谈迭代器【中】

    STL实践与分析 --再谈迭代器[中] 二.iostream迭代[续] 3.ostream_iterator对象和ostream_iterator对象的使用 能够使用ostream_iterator对 ...

  7. C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】

    STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...

  8. C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法

    STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...

  9. C++ Primer 学习笔记_33_STL实践与分析(7) --容器适配器

    STL实践与分析 --容器适配器 引: 除了顺序容器.标准库还提供了三种顺序容器适配器:queue,priority_queue和stack.适配器是标准库中的概念.包含容器适配器,迭代器适配器和函数 ...

随机推荐

  1. Codeforces Round #214 (Div. 2) c题(dp)

    C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  2. Files

    write public static void write(CharSequence from, File to, Charset charset) throws IOException { asC ...

  3. Java 设计模式学习总结(下)

    (八)模板方法 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤. templateMethod()会依次调用 ...

  4. 【转】linux mknod命令解析

    转自:http://www.cnblogs.com/cobbliu/archive/2011/07/05/2389014.html 个人觉得linux的软件设计思想异常强大,比如把所有的设备都当做文件 ...

  5. LoadRunner界面分析(二)

    1.Controller 2.创建运行场景 3.方案设计 4.Resuls settting 5.监视方案

  6. centos7虚拟机无法上网的解决办法

    今天在VMware虚拟机中经过千辛万苦终于安装好了centos7..正兴致勃勃的例行yum update 却发现centos系统貌似默认网卡没配置好,反馈无法联网.经过一番研究,终于让centos连上 ...

  7. 应用scikit-learn做文本分类(转)

    文本挖掘的paper没找到统一的benchmark,只好自己跑程序,走过路过的前辈如果知道20newsgroups或者其它好用的公共数据集的分类(最好要所有类分类结果,全部或取部分特征无所谓)麻烦留言 ...

  8. fork()函数详解

    linux中fork()函数详解(原创!!实例讲解) (转载)    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程 ...

  9. public static void main(String arg[])

      该语句定义了main方法. main方法是程序执行的入口,所有的java程序都必须具备一个main()方法,而且必须按照如上的格式来定义. 不具有main方法的类可以编译,但不能执行.因为它没有m ...

  10. Python的数据处理学习(二)

    本文参考Paul Barry所著的<Head First Python>一书,参考代码均可由http://python.itcarlow.ie/站点下载.本文若有任何谬误希望不吝赐教~ 二 ...