Проверка, что строка равна одному из значений
От: Lonely Dog Россия  
Дата: 23.03.19 07:49
Оценка:
Добрый день!

Есть следующий код:
if (status == "1234" ||
    status == "2345" || 
    status == "3456")
{
 // do something
}


В реальности, в этом if гораздо больше условий. На питоне я бы написал это так:
if status in ["1234", "2345", "3456"]:
  # do something


А можно ли что-нибудь такое написать на C++, как-нибудь сократить код?
Отредактировано 23.03.2019 7:59 Lonely Dog . Предыдущая версия .
Re: Проверка, что строка равна одному из значений
От: kov_serg Россия  
Дата: 23.03.19 07:54
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Добрый день!


LD>В реальности, в этом if гораздо больше условий. На питоне я бы написал это так:

LD>А можно ли что-нибудь такое написать на C++, как-нибудь сократить код?
if (confirms_all_conditions(status)) // ...
Re[2]: Проверка, что строка равна одному из значений
От: Lonely Dog Россия  
Дата: 23.03.19 07:57
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, Lonely Dog, Вы писали:


LD>>Добрый день!


LD>>В реальности, в этом if гораздо больше условий. На питоне я бы написал это так:

LD>>А можно ли что-нибудь такое написать на C++, как-нибудь сократить код?
_>
_>if (confirms_all_conditions(status)) // ...
_>

так а дальше что? в функции будет тот же самый большой if с кучей условий
Re: Проверка, что строка равна одному из значений
От: Пирожочек  
Дата: 23.03.19 07:59
Оценка: +1 -4
Здравствуйте, Lonely Dog, Вы писали:

LD>А можно ли что-нибудь такое написать на C++, как-нибудь сократить код?


if (std::hash_set<std::string> {
      "1234", "2345", "3456"
    }.count(status))
{
  // do something
}
Re: Проверка, что строка равна одному из значений
От: LaptevVV Россия  
Дата: 23.03.19 08:33
Оценка: +1 -1
LD>А можно ли что-нибудь такое написать на C++, как-нибудь сократить код?
Радость ты моя, а заранее все эти строки запихать в контейнер — никак?
Вместо вложенных ифов — просто найти в контейнере и сделать, чего с ним связано.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Проверка, что строка равна одному из значений
От: Lonely Dog Россия  
Дата: 23.03.19 08:45
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LD>>А можно ли что-нибудь такое написать на C++, как-нибудь сократить код?

LVV>Радость ты моя, а заранее все эти строки запихать в контейнер — никак?
LVV>Вместо вложенных ифов — просто найти в контейнере и сделать, чего с ним связано.
Да можно наверное. Что-нибудь типа такого?

bool isStringInSet(const std::initializer_list<std::string> &options, const std::string &value)
{
  return std::find(std::begin(options), std::end(options), value) != std::end(options);
}

int main()
{
  if (isStringInSet({ "4321", "1234", "1111", "45423534534" }, "1234"))
    std::cout << "IN SET";
  return 0;
}


Хотелось просто более лаконично
Отредактировано 23.03.2019 8:46 Lonely Dog . Предыдущая версия .
Re[3]: Проверка, что строка равна одному из значений
От: niXman Ниоткуда https://github.com/niXman
Дата: 23.03.19 08:51
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>
LD>bool isStringInSet(const std::initializer_list<std::string> &options, const std::string &value)
LD>{
LD>  return std::find(std::begin(options), std::end(options), value) != std::end(options);
LD>}

LD>int main()
LD>{
LD>  if (isStringInSet({ "4321", "1234", "1111", "45423534534" }, "1234"))
LD>    std::cout << "IN SET";
LD>  return 0;
LD>}
LD>


линейная сложность.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: Проверка, что строка равна одному из значений
От: DenisCh Россия  
Дата: 23.03.19 08:54
Оценка: +2
Здравствуйте, Lonely Dog, Вы писали:

LD> LD>>А можно ли что-нибудь такое написать на C++, как-нибудь сократить код?


LD> LVV>Радость ты моя, а заранее все эти строки запихать в контейнер — никак?

LD> LVV>Вместо вложенных ифов — просто найти в контейнере и сделать, чего с ним связано.
LD> Да можно наверное. Что-нибудь типа такого?
LD>
LD> bool isStringInSet(const std::initializer_list<std::string> &options, const std::string &value)
LD> {
LD>   return std::find(std::begin(options), std::end(options), value) != std::end(options);
LD> }
LD> int main()
LD> {
LD>   if (isStringInSet({ "4321", "1234", "1111", "45423534534" }, "1234"))
LD>     std::cout << "IN SET";
LD>   return 0;
LD> }
LD>

LD> Хотелось просто более лаконично

На мой необразованный, испорченный си с классами, взгляд — это самое нормальное. И самое поддерживаемое.
[url=https://github.com/abbat/avalon1.0.449[/url]
Re[4]: Проверка, что строка равна одному из значений
От: DenisCh Россия  
Дата: 23.03.19 08:55
Оценка:
Здравствуйте, niXman, Вы писали:

X> LD>
X> LD>bool isStringInSet(const std::initializer_list<std::string> &options, const std::string &value)
X> LD>{
X> LD>  return std::find(std::begin(options), std::end(options), value) != std::end(options);
X> LD>}
X> LD>int main()
X> LD>{
X> LD>  if (isStringInSet({ "4321", "1234", "1111", "45423534534" }, "1234"))
X> LD>    std::cout << "IN SET";
X> LD>  return 0;
X> LD>}
X> LD>

X> линейная сложность.

А что, это можно сделать быстрее, чем О(n) ?
Поделись мудростью.
[url=https://github.com/abbat/avalon1.0.449[/url]
Re: Проверка, что строка равна одному из значений
От: niXman Ниоткуда https://github.com/niXman
Дата: 23.03.19 08:58
Оценка:
в пайтон стиле:
    if ( static const std::set<std::string> set{"1234", "4321"}; set.count("1234") ) {
        std::cout << 1 << std::endl;
    } else {
        std::cout << 0 << std::endl;
    }
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: Проверка, что строка равна одному из значений
От: Lonely Dog Россия  
Дата: 23.03.19 09:00
Оценка:
Здравствуйте, niXman, Вы писали:

X>линейная сложность.

Само собой. Но когда вариантов не так много (не забываем, что раньше в коде была куча условий в одном if, и тоже линейная сложность), то это вполне допустимо. Тем более, создание hash_set (или еще чего-нибудь) займет явно больше времени, чем простой проход по этому списку.
Re[5]: Проверка, что строка равна одному из значений
От: niXman Ниоткуда https://github.com/niXman
Дата: 23.03.19 09:05
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>... создание hash_set (или еще чего-нибудь) займет явно больше времени, чем простой проход по этому списку.

посмотрите мой пример, в нем set будет инициализирован только один раз.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: Проверка, что строка равна одному из значений
От: Lonely Dog Россия  
Дата: 23.03.19 09:24
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Lonely Dog, Вы писали:


LD>>... создание hash_set (или еще чего-нибудь) займет явно больше времени, чем простой проход по этому списку.

X>посмотрите мой пример, в нем set будет инициализирован только один раз.
Посмотрел, осознал. Спасибо.
Re[5]: Проверка, что строка равна одному из значений
От: LuciferSaratov Россия  
Дата: 23.03.19 09:56
Оценка: +1
Здравствуйте, DenisCh, Вы писали:

DC>А что, это можно сделать быстрее, чем О(n) ?

DC>Поделись мудростью.

можно список строк (или их хэшей) заранее отсортировать и искать в нем двоичным поиском, например.
Re[6]: Проверка, что строка равна одному из значений
От: DenisCh Россия  
Дата: 23.03.19 10:46
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

LS> DC>А что, это можно сделать быстрее, чем О(n) ?

LS> DC>Поделись мудростью.
LS> можно список строк (или их хэшей) заранее отсортировать и искать в нем двоичным поиском, например.

А сортировка строк быстрее?
[url=https://github.com/abbat/avalon1.0.449[/url]
Re[7]: Проверка, что строка равна одному из значений
От: LuciferSaratov Россия  
Дата: 23.03.19 10:50
Оценка: +1
Здравствуйте, DenisCh, Вы писали:

DC>А сортировка строк быстрее?


ну дык в вопросе топикстартера список предполагается быть заранее заданным и неизменным в процессе работы программы, поэтому его можно или сразу задать отсортированным, либо отсортировать один раз перед началом работы.
Re[4]: Проверка, что строка равна одному из значений
От: _NN_ www.nemerleweb.com
Дата: 23.03.19 14:31
Оценка:
Здравствуйте, niXman, Вы писали:


X>линейная сложность.

Python код также будет с линейной сложностью в этом примере
if status in ["1234", "2345", "3456"]:
  # do something
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Проверка, что строка равна одному из значений
От: niXman Ниоткуда https://github.com/niXman
Дата: 23.03.19 14:58
Оценка: -1
Здравствуйте, _NN_, Вы писали:

_NN>Python код также будет с линейной сложностью в этом примере


в пайтоне это норма, но мы в плюсах так не делаем.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[6]: Проверка, что строка равна одному из значений
От: _NN_ www.nemerleweb.com
Дата: 23.03.19 15:07
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, _NN_, Вы писали:


_NN>>Python код также будет с линейной сложностью в этом примере


X>в пайтоне это норма, но мы в плюсах так не делаем.

Лёгким движением [1,2,3] заменяем на {1,2,3} и получаем в пайтоне быстрый поиск.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: Проверка, что строка равна одному из значений
От: niXman Ниоткуда https://github.com/niXman
Дата: 23.03.19 15:09
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Лёгким движением [1,2,3] заменяем на {1,2,3} и получаем в пайтоне быстрый поиск.

но ни один питонщик об этом не задумается.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.