[英]sorting vector using sets
vector <int> v1(6);
//some procedure to fill the vector v1 with ints.
set <int> s(v1);
vector <int> v2(s)
這里的'v2'將包含與'v1'相同的元素,但是以升序排序。這將是該排序過程的時間復雜度。 set s以排序形式存儲int。
將數據從向量復制到集合將較慢,因為這將涉及在堆上創建數據結構(通常是紅黑樹),而排序可以在原位完成(有效地使用堆棧作為臨時數據)商店)。
#include <iostream>
#include <vector>
#include <set>
size_t gAllocs;
size_t gDeallocs;
void * operator new ( size_t sz ) { ++gAllocs; return std::malloc ( sz ); }
void operator delete ( void *pt ) { ++gDeallocs; return std::free ( pt ); }
int main () {
gAllocs = gDeallocs = 0;
std::vector<int> v { 8, 6, 7, 5, 3, 0, 9 };
std::cout << "Allocations = " << gAllocs << "; Deallocations = " << gDeallocs << std::endl;
std::set<int> s(v.begin(), v.end());
std::cout << "Allocations = " << gAllocs << "; Deallocations = " << gDeallocs << std::endl;
std::sort ( v.begin(), v.end ());
std::cout << "Allocations = " << gAllocs << "; Deallocations = " << gDeallocs << std::endl;
return 0;
}
在我的系統(clang,libc ++,Mac OS 10.8)上,將輸出:
$ ./a.out
Allocations = 1; Deallocations = 0
Allocations = 8; Deallocations = 0
Allocations = 8; Deallocations = 0
構建集合需要7個內存分配(每個條目一個)。 對向量進行排序不需要任何操作。
如果v1中沒有重復項
std::sort(v1.begin(), v1.end());
會更快
如果v1中的重復項太大,則跟蹤會更快
std::set<int> s( v1.begin(), v1.end() );
v2.assign( s.begin(), s.end() );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.