c ++ 17中的stl容器是否有三种比较方法

时间:2018-08-15 15:11:20

标签: c++ comparison c++17

是否有标准功能允许对stl容器进行三种方式的比较

例如

cmp({1,2},{1,3}) < 0
cmp({1,2},{1,2}) == 0

我想避免在一个可能的大型容器上进行两个比较,而宁愿使用一个标准函数,而不是在有标准的情况下自行滚动。我没有在stp容器的cppreference页面上看到任何内容,但我希望有一些东西。

1 个答案:

答案 0 :(得分:7)

  

是否有标准功能允许对stl容器进行三种方式的比较

不。 C ++ 20将添加std::lexicographical_compare_3way,它依赖于operator<=>及其带来的所有其他东西。

直到那时,通过稍微修改std::lexicographical_compare的作用来实现实现此目的的算法都是相当简单的:

template<class InputIt1, class InputIt2>
int compare_3way(InputIt1 first1, InputIt1 last1,
                 InputIt2 first2, InputIt2 last2)
{
    for ( ; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2 ) {
        if (*first1 < *first2) return -1;
        if (*first2 < *first1) return 1;
    }

    if (first1 == last1) {
        return (first2 == last2) ? 0 : -1;
    } else {
        return 1;
    }
}

这仍然可能对每个元素进行两次比较。因此,此简单实现的替代方法是传递另一个模板参数,该参数本身就是一个三向比较函数,该函数返回一个int,因此循环的主体为:

int c = compare3way(*first1, *first2);
if (c != 0) {
    return c;
}

默认实现可能会回退到以下位置:

struct Compare3way {
    template <typename T, typename U>
    int operator()(T const& lhs, U const& rhs) const {
        if (lhs < rhs) return -1;
        if (rhs < lhs) return 1;
        return 0;
    }
};