Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;-根据频率对自定义结构向量进行排序_C++_Algorithm_Sorting_Vector_Frequency - Fatal编程技术网

C++ c++;-根据频率对自定义结构向量进行排序

C++ c++;-根据频率对自定义结构向量进行排序,c++,algorithm,sorting,vector,frequency,C++,Algorithm,Sorting,Vector,Frequency,我需要在自定义结构数组中查找最频繁的元素。它们没有自定义ID,只是匹配属性 我正在考虑按频率对向量进行排序,但我不知道如何进行排序。请看参考文献中提供的示例,您可以通过自己的比较器来执行您想要的操作(在您的情况下,使用频率)。当然,如果您愿意,也可以使用lambda函数。我假设频率是指相同结构在数组中出现的次数 您可能希望为自定义结构创建一个哈希函数(或为您的类型重载std::hash)。然后迭代数组,为数组中的每个结构增加无序_映射上的值。这将为您提供值字段中的频率。类似于以下内容的内容将起作

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


我正在考虑按频率对向量进行排序,但我不知道如何进行排序。

请看参考文献中提供的示例,您可以通过自己的比较器来执行您想要的操作(在您的情况下,使用频率)。当然,如果您愿意,也可以使用lambda函数。

我假设频率是指相同结构在数组中出现的次数

您可能希望为自定义结构创建一个哈希函数(或为您的类型重载
std::hash
)。然后迭代数组,为数组中的每个结构增加
无序_映射
上的值。这将为您提供值字段中的频率。类似于以下内容的内容将起作用:

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::数组元素;
std::无序映射频率;
mytype最常见;
int max_频率=0;
用于(常量mytype&el:元素){
频率[el]++;
中频(频率[el]>最大频率){
最频繁=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)
        }
    }

}
struct mytype{
std::字符串名;
双重价值;
};
名称空间标准{
模板结构哈希{
size_t运算符()(常量mytype&t)常量noexcept{
//使用成员变量类型的标准库哈希实现
返回哈希()(t.name)^hash()(t.value)
}
}
}

主要目标是确保不包含完全相同值的任何两个变量将生成不同的哈希。上面的XOR将每个类型的标准库哈希函数的结果放在一起,这可能与单独的哈希算法XOR放在一起一样好。cppreference建议的另一种算法是

最简单的方法是使用
std::sort
并提供一个lambda函数来比较所需内容。您能举一个例子说明结构是什么样的,然后是一个未排序的向量,以及所需的排序向量吗?听起来您几乎需要构造一个直方图。如果是这样的话,
std::map
做得很好。我会使用一个键/值容器,可能是int的无序映射。该键将是自定义结构值(或其具有的任何自然键,即名称、ID或由您组成的东西)-第一次使用该键通过数组容器传递到映射中,递增int值。然后你会在地图上找到最大的值。该元素的键将是最常见的值。请澄清您的问题。您是否要求根据向量中某些结构出现的频率对向量进行排序。i、 如果你有这些数字,{6,4,7,6,1,4,9,6},你想根据每个数字出现的频率对它们进行排序。我不知道如何在一个过程中完成,因为我认为你需要一个过程来知道每个元素的频率。如果你有主意,我很想看看。你的答案可能不完整。我认为OP要求根据向量中某些结构出现的频率对向量进行排序。i、 e.-如果你有这些数字,{6,4,7,6,1,4,9,6},并且你想根据每个数字出现的频率对它们进行排序,你不能只进行简单的排序。也许可以使用
for(const mytype&el:elements)
来避免创建每个元素的副本。你可以只使用
std::map
而不用费心编写哈希函数,除非您有足够的元素,使恒定时间访问产生实质性的差异。有人能告诉我如何创建所需的哈希函数吗?我是新的散列和C++