Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Константны ли ключи в std::set ? учебник говорит - Да, жизнь - Нет 
V
    Опции темы
azesmcar
Дата 3.3.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

Из этого я делаю вывод, что если при изменении ключа его относительная позиция не изменится - то изменять его можно.


Неверный вывод, сейчас скажу почему. Когда я читал стандарт для этого случая я конкретно читал для map. Для map в стандарте ясно написано - ключь константный, для set там этого не написано, я согласен, но это еще ничего не значит. Возможно в стандарте есть упущения, не нам об этом судить, но логично было бы предположить что если запрещено для map, должно быть запрещено и для set.
Студия не соответствует стандарту не потому что она разрешила присвоение, а потому что как видите последствия этого присвоения ненормальны для ассоциативного контейнера. Даже если в стандарте это упистили, работаспособность подобного кода приводит к несоответствующему стандарту поведению контейнера. Т.е. несоответствию стандарта.

Если что-то явно не разрешено - это можно запретить. С такой логикой разработчики GCC создали свой компилятор. Этот код не скомпилируется в GCC. А значит код непереносимый.

Думаю все

Добавлено через 6 минут и 31 секунду
Цитата

Код

 std::set<int>::iterator it = t.find(3);
    
    const_cast<int&>(*it) = 1;



а зачем так извращаться если можно просто удалить и создать заного как советуют специалисты?
PM   Вверх
zim22
Дата 3.3.2009, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  3.3.2009,  10:12 Найти цитируемый пост)
а зачем так извращаться если можно просто удалить и создать заного как советуют специалисты?

так и буду делать. спасибо за разъяснения.



--------------------
PM MAIL   Вверх
vinter
Дата 3.3.2009, 14:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(azesmcar @  3.3.2009,  10:43 Найти цитируемый пост)
стандарт тоже не идеален

но это то, что необходимо соблюдать,а  не домысливать.

Цитата(azesmcar @  3.3.2009,  10:43 Найти цитируемый пост)
в статье C++ report явно написано что ключь должен быть константным для любого ассоциативного контейнера

не написано там такого, там написано, что лучше бы он был константен. Улавливаешь разницу между должен и желательно?
Цитата(azesmcar @  3.3.2009,  10:28 Найти цитируемый пост)
насколько соответствует СТАНДАРТУ то что в ассоциативном контейнере set может быть два одинаковых ключа - думайте сами

вполне соответсвует. По стандарту операторы вставки не вставят повторного элемента, другое стандартом не запрещается.
Цитата(azesmcar @  3.3.2009,  11:12 Найти цитируемый пост)
Студия не соответствует стандарту не потому что она разрешила присвоение

ты читать умеешь? прочитай еще раз мой пост и bsa, там написано, что стандарт не устанавливает ограничений, а значит студия имеет полного право так поступать. Да, ты там писал про VS 6.0, так будет тебе известнео, что он вышел до приянтия стандарта в 98 году и соответсвовать ему не обязан. Да и вообще приводить в пример компилятор которому 11 лет, по меньшей мере, некорректно.
Цитата(azesmcar @  3.3.2009,  11:12 Найти цитируемый пост)
Из этого я делаю вывод, что если при изменении ключа его относительная позиция не изменится - то изменять его можно.

да, это верный вывод.
вот тебе пример:
Код

struct A
{
     std::string str;
     size_t position;
     bool operator <(const A& rhs)
    { return position < rhs.position}
};
.......
std::set<A>::iterator it = t.find(3);
it->str = "I'm the new string for this position";

P.S даже если мы изменим значение, которое влияет на позицию это не является ошибкой с точки зреняи компилятора, это логическая ошибка, которая убьет контейнер, не более. Это разрешено.


--------------------
Мой блог
PM MAIL WWW   Вверх
zim22
Дата 3.3.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



 smile 
Цитата(vinter @  3.3.2009,  14:12 Найти цитируемый пост)
да, это верный вывод.

дык, это не его вывод. это мой вывод  smile 

Это сообщение отредактировал(а) zim22 - 3.3.2009, 14:19


--------------------
PM MAIL   Вверх
vinter
Дата 3.3.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



zim22, я знаю, просто цитату снимал с его поста


--------------------
Мой блог
PM MAIL WWW   Вверх
azesmcar
Дата 3.3.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



повторяюсь
Цитата

An essential requirement, without which associative containers could not work reliably at all, is this: Once a key has been inserted into the container, that key had better not be changed in any way that would change its relative position in the container. If that ever did happen, the container wouldn't know about it and its assumptions about the ordering of its entries would be violated, searches for valid entries could fail, iterators would no longer be guaranteed to traverse the contents in key order, and in general Bad Things would happen.


слово requirement тебе о чем то говорит? 
Цитата

Translation: English » Russian
    
Требование
English > Russian
Dictionary:
noun    
   1. требование
   2. необходимое условие
   3. нужда
   4. необходимое условие
   5. потребность
   6. потребность
   7. требование
   8. потребность
   9. требование
  10. требование
  11. требование


где тут слово "лучше бы"?

Цитата

но это то, что необходимо соблюдать,а  не домысливать.

никто не домысливал..и в Саттере которого ты цитировал - черным по белому написано
Цитата

standard is not as clear about this for set


там же он называет метод с const_cast - базукой

и там же называет это правило - The Associative Container "Key Rule"
http://www.google.mu/search?hl=en&q=Th...G=Google+Search
Цитата

да, это верный вывод.

если для тебя непереносимый код - нормально..тогда дальше обсуждать нечего.тема закрыта

Добавлено через 34 секунды
http://books.google.mu/books?id=_1uD7khOQo...result#PPA58,M1

вот еще ссылка на More Exceptional C++ Саттера, она как раз открыта на нужный странице.

Добавлено через 5 минут и 47 секунд
Цитата

P.S даже если мы изменим значение, которое влияет на позицию это не является ошибкой с точки зреняи компилятора, это логическая ошибка, которая убьет контейнер, не более. Это разрешено.


давайте тогда удалять несуществующие указатели, с точки зрения компилятора тут ошибок нет..нормально все, подумаешь програмка вылетит, запустим снова..делов то.. smile
PM   Вверх
vinter
Дата 3.3.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



azesmcar, мне надоел твой троллизм, ответы на все твои вопросы даны в этой теме. Все подтверждено циаттами из стандарта, вчитывайся до полного просветеления. Играть с тобой в слова нет ни желания, ни времени.


--------------------
Мой блог
PM MAIL WWW   Вверх
zim22
Дата 3.3.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  3.3.2009,  14:26 Найти цитируемый пост)
где тут слово "лучше бы"?

...that key had better not be changed...
Цитата(azesmcar @  3.3.2009,  14:26 Найти цитируемый пост)
слово requirement тебе о чем то говорит? 

говорит. но ведь дальше по тексту объясняется, что подразумевается под этим requirement.
An essential requirement is this: Once a key has been inserted into the container, that key had better not be changed in any way that would change its relative position in the container
Т.е. если relative position не меняется при изменении ключа - не меняется и логическая целостность контейнера.



--------------------
PM MAIL   Вверх
azesmcar
Дата 3.3.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

azesmcar, мне надоел твой троллизм, ответы на все твои вопросы даны в этой теме. Все подтверждено циаттами из стандарта, вчитывайся до полного просветеления. Играть с тобой в слова нет ни желания, ни времени.


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

Цитата

...that key had better not be changed...

это ничего не меняет. Слово "лучше" не всегда значит что у тебя есть резонная альтернатива. Во всяком случае в данном контексте.
Если в стандарте что-то явно не сказано - это значит что каждый волен поступить как хочет. Так же как и с примером того же Саттера про очередность подстановки параметров функции это не стандартное решение и может быть непереносимым. Конкретный пример где этот код непереносим - я привел.

цитата из стандарта
Цитата

A set is a kind of associative container that supports unique keys (contains at most one of each key value)


если в set можно запихнуть два ключа с тем же значением не нарушая инкапсуляции - это по мне нарушение стандарта. 

vinter - насчет студии - почитай внимательно еще раз..я не только про шестую говорил но и про 2005-ую. И примеры привел. И про 2003 слышал, но сам не пробовал.

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


PM   Вверх
GoldFinch
Дата 3.3.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Цитата(azesmcar @  3.3.2009,  15:39 Найти цитируемый пост)
если в set можно запихнуть два ключа с тем же значением не нарушая инкапсуляции

асм вставками и предварительным анализом бинарника я могу впихнуть чтоугодно кудаугодно
никто не должен мешать тебе отстрелить ногу если ты действительно этого хочешь
PM MAIL ICQ   Вверх
azesmcar
Дата 3.3.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



я же сказал
Цитата

не нарушая инкапсуляции 


или ты ассемблерными вставками можешь не нарушить инкапсуляцию? Я имел ввиду использованим интерфейса класса. А ты про вставки говоришь и изменение бинарного кода. По моему в сравнение не идет

Добавлено @ 17:35
GoldFinch, я даже не знаю уже какой пример привести, ты в самом деле считаешь что твой пример имеет какое-то отношение к моему сказанному? Речь о том что интерфейс класса позволяет ЗАКОННЫМИ методами привести класс в состояние несоответствующее СТАНДАРТУ.

Можно сколько угодно спорить об этом, но однозначного ответа на этот вопрос я не вижу, по мне так однозначного ответа тут нет. Я сказал - ПО МОЕМУ это нарушение стандарта. Если есть инкапсуляция, она для того чтобы скрыть внутренние данные и не позволить их изменять (речь не идет о надуманных методах которыми можно обойти инкапсуляцию). А этот класс позволяет привезти себя в состояние не соответствующее стандарту своими же методами. 

Это сообщение отредактировал(а) azesmcar - 3.3.2009, 17:36
PM   Вверх
mes
Дата 3.3.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(GoldFinch @  3.3.2009,  16:25 Найти цитируемый пост)
асм вставками и предварительным анализом бинарника я могу впихнуть чтоугодно кудаугодно 

Вопрос состоит не о физической возможности вставки, а о об отсутствии контроля компилятором.
Цитата(GoldFinch @  3.3.2009,  16:25 Найти цитируемый пост)
никто не должен мешать тебе отстрелить ногу если ты действительно этого хочешь 

Главное слово "действительно". Т.е речь идет не о сознательном действии, а о случае, когда нога становится простреленной , от какого нибудь невинного (к тому же зависящего от внешних факторов) действия. 







--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 3.3.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



mes +1


PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.