Есть ли в C ++ стандартный способ сравнения трех std:: set, векторов и т. Д.? - PullRequest
0 голосов
/ 24 апреля 2018

Есть ли эквивалент std :: string :: compare для других типов std, таких как std :: set? Я ищу встроенный алгоритм, который может сделать сравнение только один раз и дать мне что-то вроде -1, 0, 1 для меньше чем, равно, больше чем, соответственно.

Ответы [ 4 ]

0 голосов
/ 14 июня 2018

C ++ 2a вводит оператор космического корабля (<=>), который в основном делает это. (См. http://open -std.org / JTC1 / SC22 / WG21 / документы / документы / 2017 / p0515r0.pdf )

До этого вы должны полагаться на другие способы в качестве предлагаемых ответов.

0 голосов
/ 24 апреля 2018

Нет, нет единого алгоритма, который бы это делал. Но вы можете составить такую ​​функцию с использованием std::mismatch.

template<typename T1, typename T2>
int compare(T1 const& A, T2 const& B)
{
    // find the first element which differs
    auto mismatchPoint =
        std::mismatch(std::begin(A), std::end(A), std::begin(B), std::end(B));

    if (mismatchPoint.first == std::end(A)) {

        // no elements differ
        if (mismatchPoint.second == std::end(B))
            return 0;

        // A ends before B, so A < B
        return -1;
    } else if (mismatchPoint.second == std::end(B) {
        // B ends before A, so B < A
        return 1;
    } else {

        // compare the first different element
        if (*mismatchPoint.first < *mismatchPoint.second)
            return -1;
        else
            return 1;
    }
}
0 голосов
/ 24 апреля 2018

В стандартной библиотеке нет стандартной функции трехстороннего сравнения, поэтому вам нужно будет реализовать ее самостоятельно.Реализовать его с помощью оператора меньше чем просто.

Нет также стандартных алгоритмов, использующих функцию «трехстороннего сравнения» (кроме тех, которые унаследованы от C, которые в любом случае нельзя использовать с контейнерами).

Существует предложение о добавлении нового оператора в стандарт, который будет осуществлять такое сравнение.

0 голосов
/ 24 апреля 2018

Вы можете написать (используя только operator <):

template <typename T>
int compare(const T& lhs, const T& rhs)
{
    if (lhs < rhs) return -1;
    else if (rhs < lhs) return 1;
    else return 0;
}
...