Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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