c ++ - 根据频率对自定义结构的矢量进行排序

时间:2017-08-10 15:36:52

标签: c++ algorithm sorting vector frequency

我需要在自定义结构数组中找到最常用的元素。只有匹配的属性没有自定义ID。

我正在考虑按频率对矢量进行排序,但我不知道如何做到这一点。

2 个答案:

答案 0 :(得分:2)

我假设频率是指阵列中出现相同结构的次数。

您可能希望为自定义结构创建哈希函数(或类型的重载std::hash<>)。然后遍历数组,为数组中的每个结构增加unordered_map<mytype, int>的值。这将为您提供值字段中的频率。像下面这样的东西会起作用:

std::array<mytype> elements;
std::unordered_map<mytype, int> freq;
mytype most_frequent;
int max_frequency = 0;
for (const mytype &el : elements) {
    freq[el]++;
    if (freq[el] > max_frequency) {
        most_frequent = el;
    }
}

为此,地图需要能够为上述功能创建哈希。默认情况下,它尝试使用std :: hash&lt;&gt;。标准明确允许您在标准命名空间中为您自己的类型专门化此模板。你可以这样做:

struct mytype {
    std::string name;
    double value;
};
namespace std {
    template <> struct hash<mytype> {
        size_t operator()(const mytype &t) const noexcept {
            // Use standard library hash implementations of member variable types
            return hash<string>()(t.name) ^ hash<double>()(t.value)
        }
    }

}

主要目标是确保任何两个不包含完全相同值的变量将生成不同的哈希值。上面对每种类型的标准库散列函数的结果进行异或,according to Mark Nelson可能与单个散列算法XOR一起好。 cppreference hash reference建议的替代算法是Fowler-Noll-Vo hash function

答案 1 :(得分:1)

查看std::sort以及ref中提供的示例,其中您实际传递自己的比较器以执行您想要的技巧(在您的情况下,使用频率)。当然,如果你愿意,也可以使用lambda函数。