将此python行转换为C ++吗?

时间:2018-07-24 22:06:51

标签: python c++ code-translation

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)]]。为什么应该删除第二个内部列表?

1 个答案:

答案 0 :(得分:4)

Python集基于哈希。因此,Python集差异的工作原理是迭代左集,在右集的哈希图中向上查找每个元素,然后跳过匹配的元素。

C ++集基于排序(实际上是二进制搜索树),而不是散列。可以使用相同的算法,但是需要使用(对数线性而不是线性时间。因此,他们使用了在线性时间内有效的 的另一种算法:假设两个范围都已排序,则只需遍历两个平行。

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

  

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

当您为它提供未排序的范围时,它不知道您已经做到了,而是试图并行进行遍历,并感到困惑。在左侧列表通过(5, 2)之后,它已经超过了所有其他元素,因此没有其他内容被跳过。