Дает ли повторяющаяся итерация через unordered_set согласованные результаты? - PullRequest
0 голосов
/ 14 ноября 2018

Допустим, у меня есть unordered_set<int> S.

Я знаю, что могу перебрать S с помощью:

void iterate(){
    for (const auto& elem: S) {
        cout<<elem<<endl;
    }
}

У меня вопрос: если я позвоню iterate() и он напечатает определенную последовательность чисел, гарантируется ли, что если я позвоню iterate() столько раз, сколько захочу, он всегда напечатает одну и ту же последовательность?

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Да, если S не изменено. [Container.requirements.general] p6:

begin() возвращает итератор, ссылающийся на первый элемент в контейнере.

Использование определенной статьи "the" подразумевает, что есть только один такой "первый элемент". Следовательно, несколько вызовов begin() в одном (неизменном) контейнере должны возвращать итераторы, ссылающиеся на один и тот же элемент.

Кроме того, все контейнерные итераторы должны быть как минимум прямыми итераторами (см. Таблицу 64 в том же подпункте).

Остальное не соответствует требованиям для прямого итератора в [forward.iterators], в частности:

  • два разыменовываемых итератора сравнивают равные тогда и только тогда, когда результаты разыменования их связаны с одним и тем же объектом; и
  • увеличение двух равных итераторов дает равные итераторы.

Поскольку вы начинаете с одинаковых итераторов, каждый шаг итерации должен создавать одинаковые итераторы, которые должны ссылаться на один и тот же элемент в контейнере.

0 голосов
/ 14 ноября 2018

Я нашел предложение, которое гласит: «Обратите внимание, что объект unordered_set не дает никаких гарантий относительно того, какой конкретный элемент считается его первым элементом».на этом веб-сайте, я верю, что это может помочь вашему вопросу.

0 голосов
/ 14 ноября 2018

При условии, что вы не измените содержимое набора, вы получите тот же порядок элементов во время итерации.

Это потому, что итерация является детерминированной.Если внутренняя структура набора изменится без причины, итераторы станут недействительными.

...