繁体   English   中英

使用集对向量进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM