STL vector+sort排序和multiset/multimap排序比较
2014-11-05 00:00
405 查看
本文由 www.169it.com 搜集整理
在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序。在通过vector+sort进行排序时,所有元素需要先存入vector容器中,sort在排序时又需要将元素全部取出来再进行排序。multimap底层实现为红黑树,因此元素在插入的过程中就实现了排序。那么到底哪一种排序速度更快呢?
下面有一个测试程序:
程序运行结果为:
在这个测试中,vector+sort排序比multiset(multimap实现基于multiset)快多了。快速排序是目前已知的所有排序算法中最快的排序算法,因此它比基于堆排序的multiset快。
在这个测试结果出来之前,大多数人都会毫无疑问地认为multiset排序要更快。这也是有原因的,快速排序速度虽然快,但是在实际的运行过程中,它需要大量地拷贝元素,其拷贝操作的时间复杂度为o(NlogN),而基于红黑树的multiset在排序的过程中则避免了元素的拷贝。如果元素的内存占用空间比较大,那么multiset排序的速度将比vector+sort快。为了测试这个结果,将上面测试程序中的结构体改为:
然后重新编译运行测试程序,测试结果为:
这个测试结果和我们的预期一致。
总之,我们在使用STL的排序算法时,需要根据不同的元素构造来进行合适的选择,如果都是比较简单的元素,那么适合选择vector+sort来进行排序,对于由字符串构成的占用了比较大的空间的复杂元素,应该使用multiset。如果排序的元素的总个数比较少,那么选择任意一种都可以。
文章来源:STL vector+sort排序和multiset/multimap排序比较
在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序。在通过vector+sort进行排序时,所有元素需要先存入vector容器中,sort在排序时又需要将元素全部取出来再进行排序。multimap底层实现为红黑树,因此元素在插入的过程中就实现了排序。那么到底哪一种排序速度更快呢?
下面有一个测试程序:
if (gettimeofday(&tv, NULL) != 0) return 0.0; return tv.tv_sec + tv.tv_usec / 1000000.0; } struct Score { string name; double score; bool operator <( const Score& right) const { return score < right.score; } }; int main( int argc, char ** argv) { vector<Score> src; for ( int i = 0; i < 10000000; i++) { int num = rand (); char buf[32]; sprintf (buf, "%d" , num); Score score = { buf, num }; src.push_back(score); } { double stime = time (); vector<Score> res; for (vector<Score>::const_iterator it = src.begin(); it != src.end(); ++it) { res.push_back(*it); } sort(res.begin(), res.end()); double etime = time (); printf ( "vector: %f\n" , etime - stime); } { double stime = time (); multiset<Score> res; for (vector<Score>::const_iterator it = src.begin(); it != src.end(); ++it) { res.insert(*it); } double etime = time (); printf ( "multiset: %f\n" , etime - stime); } return 0; } |
1 2 3 | time vector 4.776060 multiset 10.761023 |
在这个测试结果出来之前,大多数人都会毫无疑问地认为multiset排序要更快。这也是有原因的,快速排序速度虽然快,但是在实际的运行过程中,它需要大量地拷贝元素,其拷贝操作的时间复杂度为o(NlogN),而基于红黑树的multiset在排序的过程中则避免了元素的拷贝。如果元素的内存占用空间比较大,那么multiset排序的速度将比vector+sort快。为了测试这个结果,将上面测试程序中的结构体改为:
1 2 3 4 5 6 7 8 9 10 | struct Score { string name1; string name2; string name3; string name4; double score; bool operator <( const Score& right) const { return score < right.score; } }; |
1 2 3 | time vector 12.955739 multiset 11.368364 |
总之,我们在使用STL的排序算法时,需要根据不同的元素构造来进行合适的选择,如果都是比较简单的元素,那么适合选择vector+sort来进行排序,对于由字符串构成的占用了比较大的空间的复杂元素,应该使用multiset。如果排序的元素的总个数比较少,那么选择任意一种都可以。
文章来源:STL vector+sort排序和multiset/multimap排序比较
相关文章推荐
- STL vector+sort排序和multiset/multimap排序比较
- STL vector+sort排序和multiset/multimap排序比较
- C++的STL库,vector sort排序时间复杂度 及常见容器比较
- 【vc】【STL源码】vector,deque与sort的用法比较及入门
- STL之sort:vector排序
- 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
- 利用STL中的sort对vector中指针元素的排序
- 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
- STL vector find and sort vector的查找和排序
- STL中比较常用的容器是vector,set和map,比较常用的算法有Sort等。
- c++map按value排序--将map的pair对保存到vector中,然后写比较仿函数+sort完成排序过程。
- STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase
- 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法
- 详细解说 STL 排序(Sort)
- UVa11292 The Dragon of Loowater(sort排序直接比较)
- 关于STL的排序,和比较参数cmp
- 详细解说 STL 排序(Sort)
- 详细解说 STL 排序(Sort)
- STL中的常用的vector,map,set,Sort用法
- std list/vector sort 自定义类的排序就是这么简单