我有以下形式的数据结构:
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
答案 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;
}