在C ++中对用户定义的结构进行排序

时间:2015-03-28 20:55:36

标签: c++ sorting

我有以下形式的数据结构:

struct E{
 unsigned k;
 unsigned c;
 unsigned v[100];
};

main()
{
 vector<E*> vecE;
 E e1;
 e1.k=10; e1.c=20; e1.v[0]=30; e1.v[1]=31;
 vecE.push_back(&e1);
 E e2;
 e2.k=101; e2.c=28; e2.v[0]=82; e2.v[1]=32;
 vecE.push_back(&e2);
 //sort vecE by E.k of the structure
}

我有一个包含数千个E类型对象的大型vecE。我需要一次又一次地对vecE进行排序。什么是我可以在内存中对vecE进行排序的最快方法 - 这里vecE在E.k.上排序。一个人可以做同样的方法是建立优先级队列。但由于插入,优先级将相当昂贵。还有其他一些快速方法可以对“k”进行排序。

在排序并将结果输出给用户后,我想完全删除vecE ..但是我不能这样做,因为它包含指向E的指针。我怎样才能完全破坏vecE,以便偶数值指向E被删除。

我使用的gcc版本是:gcc(Ubuntu / Linaro 4.6.4-6ubuntu2)4.6.4

2 个答案:

答案 0 :(得分:2)

鉴于E是一个非常大的结构,你应该有一个vector<E*>,这样交换元素就像交换一个整数一样快。然后,您可以使用标准标题sort中的stable_sort<algorithm>(请参阅http://www.cplusplus.com/reference/algorithm/)。

vector<E*> vecE;
sort(vecE.begin(),vecE.end(),compE);

使用:

bool compE(E* first,E* second)
{
    return (first->k < second->k);
}

最后以这种方式删除元素:

for(auto e: vecE)
{
    delete e;
}

您不需要删除矢量本身,因为它具有自动存储持续时间,并且会在范围退出时被销毁。

答案 1 :(得分:1)

class cmp{  // Function object to pass to std::sort algorithm
public:
    bool operator()(const E &a, const E &b)
    {
        return a.k > b.k;
    }
};
int main()
{ 
    vector<E> a(10);
    cmp comparator;
    sort(begin(a), end(a), comparator); 
    return 0;
}