Как set работает с уникальными ключами, но с эквивалентным значением ключей в C ++? - PullRequest
0 голосов
/ 29 января 2019
vector< pair<int,int> > v; 
    // using indices for comparing pairs
auto func = [&](int i, int j) { return v[i] > v[j]; };
    // set which will store the indices and compare keys using
    // func based on values in v
set<int, decltype(func)> index_set(func);

Если у меня есть два одинаковых значения v[0]={1,2} и v[1]={1,2}, и я вставлю их в index_set, то есть

index_set.insert(0);
index_set.insert(1);

Реальность: У меня будеттолько 1 элемент в index_set (index_set.size()=1), который является только индексом 0 и индексом 1 не вставлен.

Ожидания: Оба * 0 и 1 должен быть вставлен.

Обоснование: Согласно cplusplus , в нем говорится:

Unique keys
    No two elements in the container can have equivalent keys.

Поскольку ключи не эквивалентны (0 != 1) поэтому набор должен содержать как 0, так и 1.Почему это поведение оправдано?Я думаю, что я сбиваю с толку значения ключей для буквальных значений ключей.

Пример Minimal, Complete, Verfiable : Попробуйте этот код на ideone!

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Функция сравнения, которую вы используете, не очень интуитивно понятна.Как это было реализовано, 0 и 1 считаются эквивалентными.Если вы сначала вставите 1, 0 не будет вставлено.

Если у вас есть

v[0] = {1, 2};
v[1] = {1, 2};
v[2] = {2, 2};
v[3] = {1, 2}

Тогда, 0, 1, и 3 будут считатьсяэквивалентно, что касается set.

0 голосов
/ 29 января 2019

cplusplus.com указывает далее на страницу:

Сравнить ... Объект set использует это выражение для определения обоихпорядок следования элементов в контейнере и эквивалентность двух ключей элементов (рефлексивное сравнение их: они эквивалентны, если !comp(a,b) && !comp(b,a)).Никакие два элемента в контейнере set не могут быть эквивалентными.

Вы указали пользовательскую функцию сравнения, которая утверждает, что элементы 0 и 1 следует считать равными.Поэтому у вашего std::set будет только один из них.

...