【问题标题】:Counting partitions in C++ using STL使用 STL 在 C++ 中计算分区
【发布时间】:2020-11-22 20:52:45
【问题描述】:

想象一下,我有一个容器 C 包含某种类型的元素 T 和一个谓词,用于确定任何两个 T 类型的变量是否“等价”。例如。如果Tint,我可能有一个谓词eqv = [](int a, int b){ return a % 5 == b % 5; },这样两个整数在eqv 下是等价的,如果它们在除以五时具有相同的余数。

给定这样一个容器和一个谓词,是否有一些 STL 函数(例如来自 algorithm),我可以优雅地(即无需自己编写大量代码)确定 @987654330 下 C 的分区数@?

例如,如果eqv如上,Cstd::vector<int>{1,2,3,6,7,8}我想得到结果3(因为等价类是{1,6}{2,7}{3,8})。

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    两种方法,取决于你可以T做什么:

    • 如果您能以某种方式订购这些等价类,则创建一个std::setT 类型的对象的排序必须是非全序的,其中所有在谓词下等价的元素既不小于也不小于其类的其他元素。插入所有元素,然后计算集合的大小。

    • 如果您能以某种方式计算这些等价类的哈希,则创建一个 std::unordered_set 并将模板参数 KeyEqual 设置为您的谓词。插入所有元素,然后计算集合的大小。

    如果你只有谓词,那么我猜你会被数数困扰:

    #include <algorithm>
    #include <iostream>
    #include <vector>
    
    
    
    int main() {
        std::vector<int> elements = {1, 2, 3, 6, 7, 8};
        
        unsigned int size = 0;
        while (elements.size() > 0)
        {
            int const current = elements.front();
            auto pred = [&current] (auto const & other) {
                return (current % 5) == (other % 5);
            };
            elements.erase(std::remove_if(begin(elements), end(elements), pred), end(elements));
            ++size;
        }
        
        std::cout << size << " equivalence classes" << std::endl;
    }
    

    毕竟不是那么多代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      相关资源
      最近更新 更多