【问题标题】:Converting this python line to C++?将此 python 行转换为 C++?
【发布时间】:2019-01-01 15:23:02
【问题描述】:
diff = list(set(map(tuple, paths1)) - set(map(tuple, paths2)))

其中paths1paths2 是对列表。

例子:

paths1 = [[(1,2),(2,3),(3,4)],[(1,3),(3,5)]]
paths2 = [[(5,2),(2,3),(3,4)],[(1,3),(3,5)]]
print(list(set(map(tuple, paths1)) - set(map(tuple, paths2))))

应该输出[((1, 2), (2, 3), (3, 4))]。必须先将内部列表转换为元组,因为这种类型的列表无法散列到集合中。

在下面提供的 C++ 代码中,我尝试使用标准库中的 set_difference 函数:

#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>

int main () {

    std::vector < std::pair < int, int >>v1 =
        { std::make_pair (1, 2), std::make_pair (2, 3), std::make_pair (3, 4) };
    std::vector < std::pair < int, int >>v2 =
        { std::make_pair (5, 2), std::make_pair (2, 3), std::make_pair (3, 4) };
    std::vector < std::pair < int, int >>v3 =
        { std::make_pair (1, 3), std::make_pair (3, 5) };

    std::vector < std::vector < std::pair < int, int >>>V1 = { v1, v3 };
    std::vector < std::vector < std::pair < int, int >>>V2 = { v2, v3 };
    std::vector < std::vector < std::pair < int, int >>>diff;

    std::set_difference (V1.begin (), V1.end (), V2.begin (), V2.end (),
                std::inserter (diff, diff.begin ()));

    std::cout << "[";
    for (auto v : diff) {
        std::cout << "[";
        for (auto p : v)
            std::cout << "(" << p.first << "," << p.second << ")";
        std::cout << "]";
    }
    std::cout << "]\n";

} 

此代码打印为[[(1,2)(2,3)(3,4)][(1,3)(3,5)]]。为什么应该删除的第二个内部列表没有被删除?

【问题讨论】:

标签: python c++ code-translation


【解决方案1】:

Python 集基于散列。因此,Python 集合差异的工作原理是迭代左侧集合,在右侧集合的 hashmap 中查找每个元素,然后跳过匹配的元素。

C++ 集合基于排序(实际上是二叉搜索树),而不是散列。相同的算法可以工作,但需要 (log-linear 而不是线性时间。所以他们使用不同的算法,确实在线性时间内工作:假设两个范围都已排序,你可以走两个并行。

因此,C++ set_difference 仅适用于排序范围:

将排序范围[first1, last1)中未在排序范围[first2, last2)中找到的元素复制到以d_first开头的范围。

当你给它未排序的范围时,它不知道你已经这样做了,并试图并行遍历它们,并感到困惑。在左侧列表通过(5, 2) 之后,它已经通过了所有其他元素,因此没有其他任何内容被跳过。

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 2021-12-12
    • 2014-03-24
    • 2013-07-27
    • 2013-12-31
    • 2017-02-14
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多