STL相关

算法:
  1.排序:
     让我们来总结一下你的排序操作:

    若需对vector, string, deque, 或 array容器进行全排序,你可选择sort或stable_sort;

    若只需对vector, string, deque, 或 array容器中取得top n的元素,部分排序partial_sort是首选.

    若对于vector, string, deque, 或array容器,你需要找到第n个位置的元素或者你需要得到top n且不关系top n中的内部顺序,nth_element是最理想的;

    若你需要从标准序列容器或者array中把满足某个条件或者不满足某个条件的元素分开,你最好使用partition或stable_partition;

    若使用的list容器,你可以直接使用partition和stable_partition算法,你可以使用list::sort代替sort和stable_sort排序。若你需要得到partial_sort或nth_element的排序效果,你必须间接使用。正如上面介绍的有几种方式可以选择。

    另外,你可以使用标准的关联容器来保证容器中所有元素在操作过程中一直有序。你还可考虑非标准的STL容器priority_queue,它同样可以保证其元素在所有操作过程中一直有序(priority_queue在传统意义上属于STL的一部分,但根据“STL”定义,需要STL容器支持迭代器,而priority_queue并不支持迭代器,故不能能称为标准STL容器)。

    这时你或许会问:“性能如何?”非常好的问题。广义的讲,算法做的工作越多,花的时间越长,“稳定”性排序算法比“非稳定”性排序算法要耗时。我们可以按照其消耗的资源(时间和空间)的多少,对本文中讨论的排序算法作个排序,消耗资源越少的排在前面:

    1. partition

    2. stable_partition

    3. nth_element

    4. partial_sort

    5. sort

    6. stable_sort

    
    
    
    
 STL容器效率比较
关键词: STL    容器                                          

1.vector(动态数组)

vector支持随机存取。
vector在末端增加或删除元素时性能相当好,在前端或中部做以上操作则效率比较低,因为操作点以后的所有元素都需要移动到另外一个位置。因此,当要插入多个元素时,调用一次比调用多次效率快。
vector高效的原因在于配置了比其所容纳的元素更多的内存。内存重新配置会花很多时间。请关注capacity()成员函数。

2.deques(动态数组)

deques支持随机存取。
在deques的首端和末端插入和删除元素比较快,在中部插入和删除则比较慢。
deques的内存重分配性能比vector好。


3.list(双向链表)

list不支持随机存取。
list在任何位置安插和删除元素速度都比较快(双向链表)。
list的安插和删除操作不会使其他元素的各个pointer,reference,iterator失效。

4.set和multiset(平衡二叉树)

两者不支持直接存取元素的操作,因为是自动排序。
查找元素速度比较快。
不能直接改变元素值,否则会打乱原本正确的顺序。必须先下删除旧元素,再插入新的元素。

5.map和multimap(平衡二叉树)

基本同set。
根据已知的key查找元素速度比较快,根据value则比较慢。

 

 

 

使用选择:
    1.
      By default, you should use a vector. It has the simplest internal data structure and provides random access. Thus, data access is convenient and flexible, and data processing is often fast enough
      一般,你会使用vector,它是一个简单的数组结构和提供随机访问,因而 数据访问是容易和便利的,数据处理经常也足够快
    2.
     If you insert and/or remove elements often at the beginning and the end of a sequence, you should use a deque. You should also use a deque if it is important that the amount of internal memory used by the container shrinks when elements are removed. Also, because a vector usually uses one block of memory for its elements, a deque might be able to contain more elements because it uses several blocks.
     经常在队列头和尾插入数据,使用 deque.容器占据内存的大小很重要时使用deque(删除一个数据后),因为vector使用整块的内存区域,而deque使用多个内存区域;
    3.
     If you insert, remove, and move elements often in the middle of a container, consider using a list. Lists provide special member functions to move elements from one container to another in constant time. Note, however, that because a list provides no random access, you might suffer significant performance penalties on access to elements inside the list if you only have the beginning of the list.
     如果你经常在容器的中间插入,移除,移动元素,应该使用list,list提供一个函数从容器中移除一个元素在常数时间内.注:尽管如此,list没有提供随机访问,当你只有list起始点的时候,可能很麻烦
    4.
郭勇 16:34:51
1.缺省情况下应该使用vector.vertor的内部结构最简单,并允许随机存取,所以数据的存取十分方便灵活,数据的处理也够快.
2.如果经常要在序列头部和尾部安插和移除元素,应该采用deque.如果你希望元素被移除时,容器能够自动缩减内存,那么你也应该采用deque.此外.由于vertor通常采用一个内存区块,而deque采用多个区域,所以后者可包含更多元素.
3.如果需要经常在容器的中段执行元素的插入,删除,移动,可以考虑使用list.list提供特殊的成员函数,可以在常数时间内将元素从A容器转移到B容器中.但由于list不支持随机存取,所以如果只知道list的头部却要访问list的中段元素,性能会大打折扣.
和所有"以节点为基础"的容器相似,只要元素还时容器的以部分,list就不会令指向那些元素的迭代器失效.vertor则不然,一旦超过其容量,它的所有iterators,pointers,references都会失效;执行安插或移除操作时,也会令以部分iterators,pointers,references失效.至于deque,当它的大小改变,所有的iterators,pointers,references都会失效.
4.如果你要的容器是这种性质:"每次操作若不成功,便无效"(并以此态度处理异常),那么你应该选用list(但是不保证其asslgnment操作符和sort();而且如果元素比较过程种会抛出异常,那就不要调用merge(),remove(),remove_if(),unique()),或是采用关联容器(但是不保证多个元素的插入动作,而且如果比较准则的赋值/赋值动作都发生抛出异常,那么也不保证swap()).
5.如果你经常需要根据某个准则来搜索元素,那么应当使用"以该排序准则对元素进行排序"的set或multiset.记住理论上,面对1000个元素的排序,对数复杂度比线形复杂度好10倍.这也正是二叉数拿手好戏的发挥时机.
6.就搜索速度而言,hash table 通常比二叉数还要快5-10倍.所以如果有hash table可用,就算它尚未标准化,也应该考虑使用.但是hash table的元素并未排序,所以如果元素必须排序,它就用不上了.由于hash table不是C++标准库程序的一员,如果你要保证移植性,就必须拥有其源代码
7.如果想处理key/value pair,请采用map或multimap(可以的话请采用hash table).
8.如果需要关联式数组,应采用map.
9.如果需要字典结构,应采用multimap.
10.有一个问题比较棘手,如何根据两种不同的排序准则对元素进行排序?例如存放元素时,你希望采用客户提供的排序准则,搜索元素时,希望用另一个排序准则.这和数据库的情况相同,你需要在数种不同的排序准则下进行快速存取.这时候你可能需要两个set或map,各自拥有不同的排序准则,但共享相同的元素.注意数个群集共享相同的元素,是一种特殊技术.
11.关联式容器拥有自动排序能力,并不意味它们在排序方面的执行效率更高.实际上由于关联式容器每安插一个新元素,都要进行一次排序,所以速度反而不及序列式容器经常采用的先插入所有元素,在调用排序;

 

你可能感兴趣的:(算法,vector,list,table,Access,Pointers)