整数 unordered_set 向量的集合或 unordered_set

问题描述 投票:0回答:1

我在声明一个变量时遇到了麻烦,我打算将其用作

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
运算符?

c++ boost hash
1个回答
0
投票

看起来您正在尝试创建一个容器来存储一个 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 替代方案,您可能需要实现自己的哈希函数或使用其他可用的哈希库。

© www.soinside.com 2019 - 2024. All rights reserved.