typedef std::map<uint16_t, uint32_t> TSrcMap;
TPSrcMap sp;
TSrcMap::iterator its;
/*Code to populate the array_start.*/
/*Code to populate the array_end.*/
typedef struct port_count
{
uint32_t port_number;
uint32_t port_count;
}port_count_t;
port_count_t pcount[5];
memset(pcount,0,sizeof(pcount));
size_t structs_len = sizeof(pcount)/sizeof(port_count_t);
for(its = stcp.begin(); its != stcp.end();its++)
{
if(pcount[smallest_index].port_count < (*its).second)
{
pcount[smallest_index].port_count = (*its).second;
pcount[smallest_index].port_number = (*its).first;
#ifdef USEQSORT
qsort(pcount, structs_len, sizeof(port_count_t), struct_cmp_by_port_count);
#else
std::sort(pcount,(pcount+structs_len),cmp_by_port_count);
#endif
}
}
#ifdef USEQSORT
/* qsort struct comparision function compare port frequency*/
int struct_cmp_by_port_count(const void *a, const void *b)
{
port_count_t *ia = (port_count_t *)a;
port_count_t *ib = (port_count_t *)b;
return (ia->port_count - ib->port_count);
}
#else
/* qsort struct comparision function compare port frequency*/
int cmp_by_port_count(const port_count_t& a, const port_count_t& b)
{
return (a.port_count < b.port_count);
}
#endif
我有一个大的std :: map结构,它将port_count映射到port_number。我必须根据port_count找到最大的5个元素。(其中key是port_number)。我上面给出了一个解析循环,它调用排序算法( qsort 或 std::sort) 在大小为 5 的数组上。这是实现这一目标的最有效方法吗?就排序函数的调用次数而言。就计算效率而言,有更好的方法吗?我还尝试了 qsort 和 std::sort ,它们的性能似乎都差不多。这是因为我正在排序的数组的大小太小而无法产生重大影响。我试图理解这个算法就其复杂性而言。任何想法将不胜感激。