|
Модераторы: Daevaorn |
|
cppGhost |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
Доброго времени суток. Понимаю, что отстал лет на пять и в инете вроде говорится, мол, успокойтесь, но вопрос меня мучает. Дело касается const_iterator в set после 11 стандарта.
Зачем так сделали вцелом я понимаю. Но у меня не укладывается в голове, а как в больших проектах теперь быть? Ну то есть ситуация
утрированно, но суть проста: есть сет объектов (чтобы была уникальность массива), пробегаемся по нему и в зависимости от чего-то там меняем какие-то члены обекта "А". как теперь быть? делать const_cast? переписывать с set на map? оставаться на старом компиляторе? вешаться?) |
|||
|
||||
disputant |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Ну если вы понимаете все - то что вообще за вопрос?
Как вы себе представляете, например, изменение set<int>, в котором вы будете все элементы делать одинаковыми?... Ведь их при этом надо удалять из множества. Если что-то НЕ СУЩЕСТВЕННОЕ ДЛЯ СРАВНЕНИЯ - то объявите mutable:
Это сообщение отредактировал(а) disputant - 18.3.2016, 21:40 |
|||
|
||||
cppGhost |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
Да, я понимаю. НО, если уж я своей компании небольшой столкнулся с этой проблемой, то как же другие огроменные проекты? Или прямо в майкрософте так всё круто, что они никогда не меняли члены данных объектов, лежащих в set. Или у них во всех set'ах находятся только указатели на объекты? Ведь раньше же люди жили)) и никто н ежаловался. Ну то есть наверняка кто-то простреливал себе ногу, но это ж c++
|
|||
|
||||
disputant |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Вообще-то я никогда не слышал, что элементы set можно менять. Насколько я знаю - они ВСЕГДА, с самого начала были константными. Так что о каких таких старых проектах вы говорите - что-то не понимаю. Как и того, во имя чего надо вдруг менять элементы множества... |
|||
|
||||
cppGhost |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
Нет, ну постойте. Вот самый обычный случай. Я из БД запрашиваю какие-то элементы. Каждый такой элемент представляет собой экземпляр класса со своим набором данных. Запросов у меня много, могут возвращаться одинаковые объекты. Поэтому я использую set вместо массива для уникализации и простоты. А дальше мне нужно пройтись по этому сету и поменять какие-то свойства этих объектов, ну или для кажлго вызвать какой-нибудь неконстантный метод. И вот раньше это работало, а теперь компиляться не будет. Или вы хотите сказать, что так нормальные программисты не делают? А складывают они все вектор, затем выбрасывают дубли и делай что хочешь. А зачем тогда сет? Чтобы хранить <int> ?
Это сообщение отредактировал(а) cppGhost - 19.3.2016, 22:28 |
|||
|
||||
sQu1rr |
|
|||
Опытный Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
В теории, на практике до с++11 неконстантные итераторы позволяли менять данные. разумеется это не самое разумное занятие - нужно следить что бы не менять сортировочные данные. это был дефект стандарта и его неуспели исправить в с++03, зато исправили в с++11. так что считаем, что действительно, должны были быть константными с самого начала. В любом случае, если вы используете сет только для уникальных результатов, что вам мешает потом перенести все в вектор, и менять там. или например использовать вектор изначально и хранить список хешей или ИД или чего угодно, что бы не добавлять дубликаты. и разумеется, const_cast вполне легально, если не трогать сортировочные данные, или трогать, но не добавляться и не удалять ничего из сета. |
|||
|
||||
disputant |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
И не менять местами... Для ТС - поскольку отследить такое в общем случае невозможно - лучше этого ничего не делать |
|||
|
||||
cppGhost |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
Я понял, после 10 лет коммерческого программирования у меня открылись глаза))
p.s. странно что сырые указатели не запретили использовать)) |
|||
|
||||
disputant |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Теперь понятно, почему коммерческие программы такого качества |
|||
|
||||
cppGhost |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
очень политкорректно. что-то я не помню такого совета, например, у майерса в его книжках об stl.
|
|||
|
||||
disputant |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: нет Всего: 3 |
Политкорректностью не страдаю - не в америке, чай, живем... Ладно, раз так... "C++ и STL..." Мюссера и компании. У нас издана в 2010, у "них" - в 2001. Стр. 318 нашего издания - функции-члены для обращения к элементам. begin, end и иже с ними - описаны как "возвращает константный итератор". Кому-кому, но Мюссеру верить в области STL можно Саттер, "Решение сложных задач на C++", стр. 80 - "будучи вставлен в контейнер, ключ не должен изменять свое значение способом, который может привести к изменению его относительного положения в контейнере". Там же, стр. 83 - читайте сами, но общий смысл тот же: не надо трогать ключ, а если надо - лучше бы это делалось с предельной осторожностью с использованием const_cast, чтобы никто не мог просто так наменять там такого, что... а потому, в комитет по стандартам внесено предложение требовать, чтобы все итераторы были только константными, чтоб без const_cast никуда... 2002 год. Хватит пока что? |
|||
|
||||
cppGhost |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 101 Регистрация: 24.4.2013 Репутация: нет Всего: нет |
Снимаю шляпу
|
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Наверное меняли, но de-facto set после этого можно считать разрушенным. И что куда продолжит итерировать после такого никто гарантировать не сможет В данном случае скорее голову |
|||
|
||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |