【问题标题】:c++ - sorting a vector of custom structs based on frequencyc++ - 根据频率对自定义结构的向量进行排序
【发布时间】:2018-01-18 22:59:46
【问题描述】:

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

我正在考虑按频率对向量进行排序,但我不知道该怎么做。

【问题讨论】:

  • 最简单的方法是使用std::sort 并提供一个 lambda 函数来比较您的需要。
  • 你能举一个例子说明结构是什么样子,然后是一个未排序的向量,以及你想要的排序向量吗?
  • 听起来您几乎需要构建直方图。如果是这样的话,std::map 做得很好。
  • 我会为此使用一个键/值容器,也许是整数的 unordered_map。键将是自定义结构值(或它具有的任何自然键,即名称、ID 或您组成的东西) - 第一次通过数组箱进入带有键的地图,递增 int 值。然后你会在地图中找到最大值。该元素的键将是最常见的值。
  • 请澄清您的问题。您是否要求根据向量中某些结构出现的频率对向量进行排序。即 - 如果您有这些数字 { 6, 4, 7, 6, 1, 4, 9, 6 },并且您想按每个数字出现的频率对它们进行排序。

标签: c++ algorithm sorting vector frequency


【解决方案1】:

查看std::sort 和参考中提供的示例,您实际上通过自己的比较器来执行您想要的技巧(在您的情况下,使用频率)。当然,如果您愿意,也可以使用 lambda 函数。

【讨论】:

  • 我看不出你如何一次通过,因为我认为你需要一次通过才能知道每个元素的频率。如果你有想法,我很想看看。
  • 您的回答可能不完整。我认为 OP 要求根据向量中某些结构出现的频率对向量进行排序。 ie - 如果你有这些数字,{ 6, 4, 7, 6, 1, 4, 9, 6 },并且你想按每个数字出现的频率对它们进行排序,你不能只是简单的排序。跨度>
【解决方案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。标准明确允许您在标准命名空间中为您自己的类型专门化此模板。你可以这样做:

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 可能与单个哈希算法的异或运算一样好。 cppreference 的hash reference 建议的替代算法是Fowler-Noll-Vo hash function

【讨论】:

  • 也许使用for(const mytype&amp; el: elements) 来避免创建每个元素的副本。
  • 您可以只使用std::map 而不必费心编写散列函数,除非您有足够的元素来让常量时间访问产生重大影响。
  • 谁能告诉我如何创建所需的哈希函数?我是散列新手,也是 c++
猜你喜欢
  • 2012-11-28
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多