Есть ли способ сравнить итераторы с несколькими наборами?

avatar
24n8
1 июля 2021 в 21:03
134
1
0

Мне интересно, есть ли способ сравнить итераторы мультимножества? Мне интересно сделать что-то вроде следующего:

    std::multiset<int> mt{1,1,1,1,3,4,5};
    auto it1 = mt.find(3);
    auto it2 = mt.find(1);
    cout << (it1 < it2) << endl; // this should print "0"
    it1 = mt.find(equal_range);
    auto p = mt.equal_range(1);
    cout << (p.first < p.second) << endl; // this should print "1"

Однако я не могу использовать оператор сравнения для итераторов мультимножества.

Если бы значения в наборе были уникальными, я мог бы просто сравнить разыменованную версию итераторов, но я использую мультимножество именно потому, что значения могут быть неуникальными, и если 2 итератора указывают на разные экземпляры одного и того же значения, Мне нужен способ сравнить их на основе их относительного расположения в базовом дереве.

Источник
Drew Dormann
1 июля 2021 в 21:12
0

Это читается так, как будто вы хотите сравнить std::distance(mt.begin(), it).

Ответы (1)

avatar
eerorika
1 июля 2021 в 21:07
3

Есть ли способ сравнить итераторы мультимножества?

Нет упорядоченного сравнения. Двунаправленные итераторы, как правило, не требуются и не гарантируются, что они менее чем сравнимы.

Проблема, с которой вы столкнулись, по существу аналогична поиску порядка элементов в связанном списке. Возможен алгоритм линейной сложности:

 std::distance(std::begin(mt), it1) < std::distance(std::begin(mt), it2)

Сравнение на равенство тривиально.