代码之家  ›  专栏  ›  技术社区  ›  wheaties

STL:set\u union,includes,mismatch,find\u if但是没有includes\u any吗?

  •  0
  • wheaties  · 技术社区  · 14 年前

    set_union 创建 list 然后检查它是否是空的。然而,我比较的对象是“昂贵的”复制。我看过 includes 但只有在 全部的 一个列表中的项目可以在另一个列表中找到。我也看过 mismatch 但出于明显的原因拒绝了。

    我可以并且已经编写了我自己的函数,它假设两个列表都已排序,但我想知道STL中是否已经存在一个有效的函数。(Project禁止使用第三方库,包括Boost和TR1,不要问。)

    2 回复  |  直到 14 年前
        1
  •  3
  •   Potatoswatter R. Martinho Fernandes    14 年前

    find_first_of 对于一个O(N*M)算法。

    如果它们被分类(这是 set_intersection equal_range 另一种是每个元素。如果每个返回的范围都为空,则不存在交集。性能为O(N logm)。

    但是,没有理由没有O(N+M)性能,对吗?任何东西都不会被复制 设置交叉点 如果它传递了一个伪迭代器。

    struct found {};
    
    template< class T > // satisfy language requirement
    struct throwing_iterator : std::iterator< std::output_iterator_tag, T > {
        T &operator*() { throw found(); }
        throwing_iterator &operator++() { return *this; }
        throwing_iterator operator++(int) { return *this; }
    };
    
    template< class I, class J >
    bool any_intersection( I first1, I last1, J first2, J last2 ) {
        try {
            throwing_iterator< typename std::iterator_traits<I>::value_type > ti;
            set_intersection( first1, last1, first2, last2, ti );
            return false;
        } catch ( found const& ) {
            return true;
        }
    }
    

    这样可以提前退出。您可以交替地避免异常,只需让迭代器记住它被递增了多少次,而不必对赋值进行运算。

        2
  •  1
  •   Oliver Charlesworth    14 年前

    find_first_of() 你在找什么?