我在声明一个变量时遇到了麻烦,我打算将其用作
unordered_set
或 set
的 vector
,其元素本身就是 unordered_set<int>
。我的应用程序生成大量可能重复的 vector<unordered_set<int>
,因此决定使用这些 set
中的 unordered_set
或 vector
,以便仅存储唯一的以供以后处理。
std::unordered_set<std::vector<std::unordered_set<int>>, \
boost::hash<std::vector<std::unordered_set<int>>>> Variable1;
给出错误
boost::hash_value - none of the 3 overloads could convert all the argument types
。是否有提升/非提升方式来提供适当的哈希函数?
set
的用法如下:
std::set<std::vector<std::unordered_set<int>>> Variable2;
需要指定
<
运算符来比较 vector
s的两个不同
unordered_set
是否有预定义的方法来实现
<
中 vector
的 unordered_set
运算符?
看起来您正在尝试创建一个容器来存储一个 unordered_set 或一组其元素本身就是 unordered_sets 的向量。我认为您遇到了哈希和比较运算符的问题。让我们解决这些问题:
1。
std::unordered_set
的 std::vector
的 std::unordered_set<int>s
的哈希函数:
要使用 std::unordered_set
of std::vector
of std::unordered_set<int>s
,您需要提供哈希函数。这是使用 Boost 定义自定义哈希函数的方法:
#include <boost/functional/hash.hpp>
#include <unordered_set>
#include <vector>
namespace std {
template <>
struct hash<std::vector<std::unordered_set<int>>> {
size_t operator()(const std::vector<std::unordered_set<int>>& v) const {
size_t seed = 0;
for (const auto& uset : v) {
boost::hash_combine(seed, uset);
}
return seed;
}
};
}
此哈希函数迭代无序集合的向量,并使用
boost::hash_combine
组合哈希值
2。
std::set
of std::vector
of std::unordered_set<int>s
的比较运算符:
如果您想在 std::vector
中使用它,您可能需要为 std::unordered_set<int>s
的 std::set
定义一个比较运算符。我认为没有预定义的方法来比较如此复杂的结构,因此您需要定义自己的比较逻辑。这是一个例子:
bool operator<(const std::vector<std::unordered_set<int>>& lhs, const std::vector<std::unordered_set<int>>& rhs) {
if (lhs.size() != rhs.size()) {
return lhs.size() < rhs.size();
}
auto cmpUnorderedSets = [](const std::unordered_set<int>& a, const std::unordered_set<int>& b) {
return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
};
return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), cmpUnorderedSets);
}
此比较运算符首先按大小比较向量,然后按字典顺序比较向量内的各个无序集合。
通过这些修改,您应该能够按照应用程序中的预期使用
std::unordered_set<std::vector<std::unordered_set<int>>>
或 std::set<std::vector<std::unordered_set<int>>>
。这些示例使用 Boost 进行哈希处理。如果您正在寻找非 Boost 替代方案,您可能需要实现自己的哈希函数或使用其他可用的哈希库。