我需要一组 TVertex 对象才能通过不同的参数(id 和 flow)访问它们的排序。在 O(1) 时间内找到第 k 个元素并在 o(log2(N)) 时间内更新它们的属性。
为此,我使用 TComparatorF 和 TComparatorI 类。
它们都有一个指向 TVertex 和运算符 > 和 <
TComparatorF 比较流
TComparatorI 比较 id
TVertex() 将一个指向自身的指针指向一个比较器。然后把比较器放到一组比较器上。
但是当我更新 TVertex 对象的属性时,相对于它的比较器的位置不会改变。
有没有办法强制我的集合更新或存储多个排序的更好主意?
代码:
#include<stdio.h>
#include<set>
#include<stdlib.h>
using namespace std;
const int N=300000;
struct TVertex;
struct TComparatorF
{
TVertex *cmp;
bool operator >(const TComparatorF &other) const;
bool operator <(const TComparatorF &other) const;
};
struct TComparatorI
{
TVertex *cmp;
bool operator >(const TComparatorI &other) const;
bool operator <(const TComparatorI &other) const;
};
set <TComparatorF> flowset;
set <TComparatorI> idset;
struct TVertex
{
int flow,id;
TVertex();
};
bool TComparatorF::operator >(const TComparatorF &other) const
{
return !(*cmp).flow>(*(other.cmp)).flow;
}
bool TComparatorF::operator <(const TComparatorF &other) const
{
return !(*cmp).flow<(*(other.cmp)).flow;
}
bool TComparatorI::operator >(const TComparatorI &other) const
{
return !(*cmp).id>(*(other.cmp)).id;
}
bool TComparatorI::operator <(const TComparatorI &other) const
{
return !(*cmp).id<(*(other.cmp)).id;
}
TVertex::TVertex()
{
flow=0;
TComparatorF comp;
comp.cmp=this;
flowset.insert(comp);
TComparatorI comp2;
comp2.cmp=this;
idset.insert(comp2);
}
TVertex ver[N];
int main()
{
ver[0].flow=17;
ver[0].id=6;
ver[1].flow=100;
ver[1].id=5;
ver[2].flow=5798;
ver[2].id=40;
TComparatorF comp=*(flowset.begin());
TComparatorI comp2=*(idset.begin());
printf("%d %d\n",(*(comp.cmp)).flow,(*(comp2.cmp)).id);
system("PAUSE");
return 0;
}
我明白了
17 6
代替
5798 40