![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| cristaloleg |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 15.6.2009 Где: Donetsk Репутация: нет Всего: нет |
if x in [1,2,5] then
Как это записать в С++? Зы если нужно подключить заголовочные файлы, то скажите... |
|||
|
||||
| zim22 |
|
||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
*** более С++ подход
Это сообщение отредактировал(а) zim22 - 16.6.2009, 20:09 |
||||
|
|||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
1-ый вариант плох своей крайней неуниверсальностью - так можно эмулировать только константные сеты.
2-ой - в первую очередь линейной (а не константной, как в Паскалевском варианте) сложностью. Если речь именно о записи строчки в первом посте - то вариант 1 вполне сойдёт. Впрочем, для трёх значений вообще можно написать иф с тремя сравнениями... Если же речь о паскалевских множествах в принципе - std::set. Правда, константной сложности поиска/добавления/удаления мы тут не получим. "Почти" константной она будет для всяких hash_set, unordered_set - вообщем, что там ближе |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Как Паскаль компилирует это выражение? Я думаю, тоже будет линейная сложность.
|
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Нет. set в паскале - это всегда 8 байтов, поэтому сеты можно создавать только из однобайтовых данных (в дельфях быть может есть какие-т опции для этого - к счастью, я это плохо уже помню...). Добавление/удаление элемента в множество - установка/сброс соответствующего бита. Проверка принадлежности (in) - проверка одного бита. Т. е. сложность константная.
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Размер зависит от числа элементов. Максимум 256 бит / 8 = 32 байта. Добавлено через 4 минуты и 21 секунду А зря очень удобная фича, но думаю что в С++ можно создать временный объект и в конструкторе передать элементы -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Такой Set можно создать и в C++. См. его реализацию в Borland C++ Builder. Сложность проверки такая же, как в Delphi, но перед этим Set нужно заполнить - линейная зависимость от числа элементов в Set.
Это сообщение отредактировал(а) math64 - 16.6.2009, 22:59 |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Ээ.. 1. Как это размер зависит? У нас есть переменная (set of что-нибудь). Добавляем элемент в неё. Ты хочешь сказать при этом изменится размер, занимаемой этой переменной? 2. Да, с арифметикой у меня совсем туго Добавлено через 1 минуту и 49 секунд А, блин, сорри, кажется понял - речь про "количество" задаваемое минимумом/макисмумом при описании самого типа? Если я опять не туплю, тогда всё нормально - просто я действительно не помню Паскаль и типы-диапазоны (ну или как там это называется?) Добавлено через 13 минут и 5 секунд А разве, если у нас объявлено констатное множество компилятор паскаля не сможет его сам построить (в компайл-тайм всмысле)? Да и, в любом случае - если мы выполняем n добавлений (в рантайме) - то само собой это не может иметь постоянную сложность |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Если у нас константное множество, то и с++ его можно заполнить в компайл-тайм.
Стоит ли оно того, вопрос. -------------------- ... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Перевыделяется память и создается новое множество большего размера. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Эээ.. что-т я не понял. Если действительно так - то зачем нужно такое вообще?! И почему тогда ограничение на размер данных (типа set of integer не сделаешь). Блин, как будет время - найду компилятор дельфи/паскаля, надо проверить, что он там генерит |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
И всё время хранится максимальный элемент множества что ли (иначе вообще не представляю, как это может работать)?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Может понадобиться до 500 Мб для одной такой переменной. Добавлено через 1 минуту и 36 секунд
Если добавляешь число 217, то устанавливается 217 бит в 1. Чтобы его проверить, смотришь значение этого бита. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Так.. Я всё равно не понял. Ты говоришь, что размер зависит от количества элементов. Для пустого множества что хранится?
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
ShowMessage(IntToStr(sizeof([0, 1]))); показывает 1 байт ShowMessage(IntToStr(sizeof([]))); показывает 32 байта Добавлено через 11 минут и 33 секунды Если переменная множества создается явно, то размер всегда будет кол элементов / 8 ; Если же нет, то размер меняется по обстоятельствам. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
для пустого множества или пустого диапазона ? Это сообщение отредактировал(а) mes - 17.6.2009, 13:19 |
|||
|
||||
| Любитель |
|
||||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Ну, вот об этом и речь, те вот это никогда не происходит на самом деле:
Как я понимаю здесь просто создаётся константа типа set of 0..1 (надеюсь, синтаксис правильно написал?), соответственно размер один байт (ибо больше не надо). Если же переменную создаём - то размер константен и рассчитывается исходя из диапазона в описании типа (если указан просто тип - то весь диапазон этого типа). Для пустого множества-константы по-видимому берётся какой-то дефолтный тип.. Добавлено через 1 минуту и 23 секунды Множества. Просто я запусталя из-за слов Alexeis-а о перевыделении памяти. Думал, вдруг там всегда минимизируется используемая память (ИМХО это того не стоит в данном случае, потерь обльше чем выигрыша). |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
mes, про диапазоны тут речи нет. В паскале [0,1,2,3,4] или ['a'..'z', 'B', ' '] это множества. Просто это встроенный тип функциональность которого обеспечивается компилятором. Он не работает также как объект. Для него не создается специального объекта. Это некий тип не имеющий прообраза в асме. В С++ можно создать простой стековый объект, который будет делать тоже самое и работать также быстро, хотя получить синтаксис ['a'..'z', 'B', ' '] вряд ли удаться, но что-то аналогичное [0,1,2,3,4] запросто.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Пустое множество имеет максимальный диапазон В рантайме такого не происходит. Кол-во памяти определяется на этапе компиляции. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
На самом деле как будет ли выделение памяти или нет зависит от компилятора, судя по проведенным экспериментам все таки перераспределение не происходит... -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Сейчас запутаемся кто о чем говорит. Для переменной одного и того же типа сета, перераспределения не происходит. Это сообщение отредактировал(а) mes - 17.6.2009, 13:36 |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
||||
|
||||
| sdukshis |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 23.3.2009 Репутация: нет Всего: 1 |
Может я и неправильно понял автора, но если нужно именно это:
то
|
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
sdukshis, а если нужно будет перенести
Точно также писать ? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| sdukshis |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 23.3.2009 Репутация: нет Всего: 1 |
|
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |