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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В Паскале так, а в С++... if x in [1,2,5] then 
:(
    Опции темы
cristaloleg
Дата 16.6.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 15.6.2009
Где: Donetsk

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



if x in [1,2,5] then
Как это записать в С++?
Зы если нужно подключить заголовочные файлы, то скажите...
PM   Вверх
zim22
Дата 16.6.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Код

switch (x) {
  case 1:
  case 2:
  case 5: {
    // do smth
  }break;
  default: std::cout << "value is different from 1,2,5";
}

***
более С++ подход
Код

#include <iostream>
#include <algorithm>

int arr[] = {1, 2, 5};
int x = 2;
int *find_it = std::find(arr, arr + 3, x);
if (find_it != arr + 3)
  std::cout << "exist";


Это сообщение отредактировал(а) zim22 - 16.6.2009, 20:09


--------------------
PM MAIL   Вверх
Любитель
Дата 16.6.2009, 20:42 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



1-ый вариант плох своей крайней неуниверсальностью - так можно эмулировать только константные сеты.

2-ой - в первую очередь линейной (а не константной, как в Паскалевском варианте) сложностью. 

Если речь именно о записи строчки в первом посте - то вариант 1 вполне сойдёт. Впрочем, для трёх значений вообще можно написать иф с тремя сравнениями...

Если же речь о паскалевских множествах в принципе - std::set. Правда, константной сложности поиска/добавления/удаления мы тут не получим. "Почти" константной она будет для всяких hash_set, unordered_set - вообщем, что там ближе smile Можно сделать специализацию шаблона std::set, скажем, для char - полностью аналогичную паскалевским множествам smile 


--------------------
PM MAIL ICQ Skype   Вверх
math64
Дата 16.6.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как Паскаль компилирует это выражение? Я думаю, тоже будет линейная сложность.
PM   Вверх
Любитель
Дата 16.6.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Нет. set в паскале - это всегда 8 байтов, поэтому сеты можно создавать только из однобайтовых данных (в дельфях быть может есть какие-т опции для этого - к счастью, я это плохо уже помню...). Добавление/удаление элемента в множество - установка/сброс соответствующего бита. Проверка принадлежности (in) - проверка одного бита. Т. е. сложность константная.


--------------------
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 16.6.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Любитель @  16.6.2009,  21:35 Найти цитируемый пост)
Нет. set в паскале - это всегда 8 байтов, поэтому сеты можно создавать только из однобайтовых данных 

  Размер зависит от числа элементов. Максимум 256 бит / 8 = 32 байта.

Добавлено через 4 минуты и 21 секунду
Цитата(Любитель @  16.6.2009,  21:35 Найти цитируемый пост)
к счастью, я это плохо уже помню...

  А зря очень удобная фича, но думаю что в С++ можно создать временный объект и в конструкторе передать элементы


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
math64
Дата 16.6.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Такой Set можно создать и в C++. См. его реализацию в Borland C++ Builder. Сложность проверки такая же, как в Delphi, но перед этим Set нужно заполнить - линейная зависимость от числа элементов в Set.

Это сообщение отредактировал(а) math64 - 16.6.2009, 22:59
PM   Вверх
Любитель
Дата 17.6.2009, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Alexeis @  16.6.2009,  22:48 Найти цитируемый пост)
Размер зависит от числа элементов. Максимум 256 бит / 8 = 32 байта.

Ээ..
1. Как это размер зависит? У нас есть переменная (set of что-нибудь). Добавляем элемент в неё. Ты хочешь сказать при этом изменится размер, занимаемой этой переменной?
2. Да, с арифметикой у меня совсем туго smile

Добавлено через 1 минуту и 49 секунд
А, блин, сорри, кажется понял - речь про "количество" задаваемое минимумом/макисмумом при описании самого типа? Если я опять не туплю, тогда всё нормально - просто я действительно не помню Паскаль и типы-диапазоны (ну или как там это называется?)

Добавлено через 13 минут и 5 секунд
Цитата(math64 @  16.6.2009,  22:59 Найти цитируемый пост)
линейная зависимость от числа элементов в Set.

А разве, если у нас объявлено констатное множество компилятор паскаля не сможет его сам построить (в компайл-тайм всмысле)?
Да и, в любом случае - если мы выполняем n добавлений (в рантайме) - то само собой это не может иметь постоянную сложность smile Но для каждой операции (добавление/удаление/поиск в данном случае) она будет постоянной.


--------------------
PM MAIL ICQ Skype   Вверх
Earnest
Дата 17.6.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Если у нас константное множество, то и с++ его можно заполнить в компайл-тайм.
Стоит ли оно того, вопрос.


--------------------
...
PM   Вверх
Alexeis
Дата 17.6.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Любитель @  16.6.2009,  23:16 Найти цитируемый пост)
1. Как это размер зависит? У нас есть переменная (set of что-нибудь). Добавляем элемент в неё. Ты хочешь сказать при этом изменится размер, занимаемой этой переменной?

  Перевыделяется память и создается новое множество большего размера.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Любитель
Дата 17.6.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Alexeis @  17.6.2009,  11:31 Найти цитируемый пост)
Перевыделяется память и создается новое множество большего размера. 

Эээ.. что-т я не понял. Если действительно так - то зачем нужно такое вообще?! И почему тогда ограничение на размер данных (типа set of integer не сделаешь). Блин, как будет время - найду компилятор дельфи/паскаля, надо проверить, что он там генерит smile Всё время думал, что размер множества определяется в окмпайл-тайм, а добавление/удаление - установка/сброс бита и не более того.


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 17.6.2009, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Любитель @  17.6.2009,  10:45 Найти цитируемый пост)
И почему тогда ограничение на размер данных (типа set of integer не сделаешь).

так как мала вероятность  относительно плотного заполнения такого диапазона при использовании и поэтому (в целях экономии памяти) лучше представить его набором стандартных диапазонов.





--------------------
PM MAIL WWW   Вверх
Любитель
Дата 17.6.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



И всё время хранится максимальный элемент множества что ли (иначе вообще не представляю, как это может работать)?


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 17.6.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Любитель @  17.6.2009,  11:13 Найти цитируемый пост)
И всё время хранится максимальный элемент множества что ли (иначе вообще не представляю, как это может работать)? 

условные начало и конец диапазона и битовая последовательность его отражающая. 



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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Любитель @  17.6.2009,  10:45 Найти цитируемый пост)
И почему тогда ограничение на размер данных (типа set of integer не сделаешь).

  Может понадобиться до 500 Мб для одной такой переменной.

Добавлено через 1 минуту и 36 секунд
Цитата(Любитель @  17.6.2009,  11:13 Найти цитируемый пост)
И всё время хранится максимальный элемент множества что ли (иначе вообще не представляю, как это может работать)? 

  Если добавляешь число 217, то устанавливается 217 бит в 1. Чтобы его проверить, смотришь значение этого бита.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Любитель
Дата 17.6.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Так.. Я всё равно не понял. Ты говоришь, что размер зависит от количества элементов. Для пустого множества что хранится?


--------------------
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 17.6.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Любитель @  17.6.2009,  11:58 Найти цитируемый пост)
Так.. Я всё равно не понял. Ты говоришь, что размер зависит от количества элементов. Для пустого множества что хранится? 

 ShowMessage(IntToStr(sizeof([0, 1]))); показывает 1 байт
 ShowMessage(IntToStr(sizeof([]))); показывает 32 байта

Добавлено через 11 минут и 33 секунды
  Если переменная множества создается явно, то размер всегда будет кол элементов / 8 ; Если же нет, то размер меняется по обстоятельствам. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 17.6.2009, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Любитель @  17.6.2009,  11:58 Найти цитируемый пост)
Для пустого множества что хранится? 

для пустого множества или пустого диапазона ?  smile 


Это сообщение отредактировал(а) mes - 17.6.2009, 13:19


--------------------
PM MAIL WWW   Вверх
Любитель
Дата 17.6.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Alexeis @  17.6.2009,  13:03 Найти цитируемый пост)
Если переменная множества создается явно, то размер всегда будет кол элементов / 8 

Ну, вот об этом и речь, те вот это никогда не происходит на самом деле:
Цитата(Alexeis @  17.6.2009,  11:31 Найти цитируемый пост)
  Перевыделяется память и создается новое множество большего размера. 


Цитата(Alexeis @  17.6.2009,  13:03 Найти цитируемый пост)
ShowMessage(IntToStr(sizeof([0, 1])));

Как я понимаю здесь просто создаётся константа типа set of 0..1 (надеюсь, синтаксис правильно написал?), соответственно размер один байт (ибо больше не надо). Если же переменную создаём - то размер константен и рассчитывается исходя из диапазона в описании типа (если указан просто тип - то весь диапазон этого типа). Для пустого множества-константы по-видимому берётся какой-то дефолтный тип..

Добавлено через 1 минуту и 23 секунды
Цитата(mes @  17.6.2009,  13:17 Найти цитируемый пост)
для пустого множества или пустого диапазона ? 

Множества. Просто я запусталя из-за слов Alexeis-а о перевыделении памяти. Думал, вдруг там всегда минимизируется используемая память (ИМХО это того не стоит в данном случае, потерь обльше чем выигрыша).


--------------------
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 17.6.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



mes, про диапазоны тут речи нет. В паскале [0,1,2,3,4] или ['a'..'z', 'B', ' '] это множества. Просто это встроенный тип функциональность которого обеспечивается компилятором. Он не работает также как объект. Для него не создается специального объекта. Это некий тип не имеющий прообраза в асме. В С++ можно создать простой стековый объект, который будет делать тоже самое и работать также быстро, хотя получить синтаксис  ['a'..'z', 'B', ' '] вряд ли удаться, но что-то аналогичное [0,1,2,3,4] запросто.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 17.6.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Любитель @  17.6.2009,  12:23 Найти цитируемый пост)
Множества. 

Пустое множество имеет максимальный диапазон  smile

Цитата(Любитель @  17.6.2009,  12:23 Найти цитируемый пост)
Думал, вдруг там всегда минимизируется используемая память

В рантайме такого не происходит. Кол-во памяти определяется на этапе компиляции.




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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Любитель @  17.6.2009,  12:23 Найти цитируемый пост)
Множества. Просто я запусталя из-за слов Alexeis-а о перевыделении памяти. Думал, вдруг там всегда минимизируется используемая память (ИМХО это того не стоит в данном случае, потерь обльше чем выигрыша). 

  На самом деле как будет ли выделение памяти или нет зависит от компилятора, судя по проведенным экспериментам все таки перераспределение не происходит... 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 17.6.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alexeis @  17.6.2009,  12:28 Найти цитируемый пост)
На самом деле как будет ли выделение памяти или нет зависит от компилятора, судя по проведенным экспериментам все таки перераспределение не происходит...  

Сейчас запутаемся кто о чем говорит. 

Для переменной одного и того же типа сета, перераспределения не происходит. 




Это сообщение отредактировал(а) mes - 17.6.2009, 13:36


--------------------
PM MAIL WWW   Вверх
Любитель
Дата 17.6.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(mes @  17.6.2009,  13:35 Найти цитируемый пост)
Для переменной одного и того же типа сета, перераспределения не происходит. 

Вот я тоже так всегда думал. А в этой теме поназапутали меня, а я затем всех остальных smile 


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


Шустрый
*


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

Репутация: нет
Всего: 1



Может я и неправильно понял автора, но если нужно именно это:
Код

if x in [1,2,5] then

то
Код

if (x==1 || x==2 || x==5 ){
//...
}



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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



sdukshis, а если нужно будет перенести 
Код

if x in [1,2,5..75] then


Точно также писать ? smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
sdukshis
Дата 19.6.2009, 21:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Цитата(Alexeis @ 19.6.2009,  20:25)
sdukshis, а если нужно будет перенести 
Код

if x in [1,2,5..75] then


Точно также писать ? smile

Код

if (x == 1 || x==2 || (x>=5 && x <=75)){
}

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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