Можете ли вы найти, какой экземпляр мультимножества содержит данный итератор?

avatar
24n8
1 июля 2021 в 21:27
22
1
1

Допустим, у меня есть несколько экземпляров мультимножества, и мне дан итератор it для одного из экземпляров, но мне не сказано, к какому экземпляру принадлежит этот итератор. Существует ли способ O(1) для каждого экземпляра определить, принадлежит ли этот итератор этому экземпляру или нет? Для этого я думаю, что мультимножественный контейнер должен включать какую-то хэш-таблицу для итераторов, которые он содержит, но я не верю, что библиотека STL делает это.

Я не смог найти в документации функцию, которая делала бы это, поэтому единственный подход, который я могу придумать, это сначала отдать должное заданному итератору и использовать instance.find(*it), а если он найден, мы используем std::multiset::equal_range для выполнения линейный поиск, чтобы увидеть, является ли один из итераторов, указывающих на одно и то же значение, заданным итератором.

Источник

Ответы (1)

avatar
Sam Varshavchik
1 июля 2021 в 21:58
3

Короткий ответ: нет. Более того, использование итератора в той или иной форме с контейнером, из которого он не исходит, является поведением undefined. Наконец, сравнение двух итераторов из разных контейнеров также является неопределенным поведением, поэтому описанный вами обходной путь также является неопределенным поведением.

Вышеприведенное относится ко всем контейнерам в библиотеке C++, а не только к мультинабору.

Объекты, на которые ссылаются ваши итераторы, должны будут ссылаться в той или иной форме на то, частью какого контейнера они являются; других практических альтернатив нет.

24n8
1 июля 2021 в 22:14
0

Когда вы говорите «контейнеры», вы имеете в виду разные экземпляры одного и того же контейнера, а не разные типы? Я всегда думал, что «контейнеры» означают такие вещи, как векторы, наборы, карты и т. д., а не экземпляры вектора или набора и т. д.

Sam Varshavchik
1 июля 2021 в 22:16
0

Термин «контейнер» в основном взаимозаменяем и может относиться либо к отдельным шаблонам, либо к экземплярам этих шаблонов. Как я использую его здесь, он относится к конкретным экземплярам классов шаблонов. Так же, как термин «автомобиль» может относиться к любому устройству, имеющему четыре колеса, пару дверей, несколько сидений, руль и некоторые другие общие черты; и это также может относиться к конкретному, отдельному куску ржавчины на вашей дороге.