@ProCxx

Страница 1408 из 2477
Alexander
16.10.2017
13:50:20
я бы написал проще - обёртку над мапой, которая при отсутсвтии значения вернёт сделает то, что нужно

что ж поделать, что нет у нас default значения как параметр

Evgeniy
16.10.2017
13:51:56
я бы написал проще - обёртку над мапой, которая при отсутсвтии значения вернёт сделает то, что нужно
ну я пришел к чему то вроде int get(std::map<smth, int> mp, smth key) { return mp.find(key) == mp.end() ? -1 : mp[key];}

Google
Evgeniy
16.10.2017
13:52:31
но криво же

Alexander
16.10.2017
13:52:44
только написать это более обощённо и запихунть в свой утилити лайбрари

а что делать, что дефолта нет у нас. ЕМНИП, есть пропозал об этом

Evgeniy
16.10.2017
13:58:06
Constantine
16.10.2017
13:59:27
а что мешает написать ручками get_with_default для const& мапы?

Constantine
16.10.2017
14:00:12
я не про стандарт, это вроде как нештатное использование для std::map

Pepe
16.10.2017
14:00:21
но криво же
может это xy проблем

Constantine
16.10.2017
14:00:59
некрасиво же)
некрасиво что? имхо внешние функции с унифицированными отглагольными именами являются лучшей архитектурой в природе

Alexander
16.10.2017
14:01:40
может это xy проблем
неа. это известные грабли

Evgeniy
16.10.2017
14:01:47
Alexander
16.10.2017
14:02:11
принимает контейнер и дефолт значение

Google
Alexander
16.10.2017
14:02:42
а там внутри пусть ищёт.

Anatoly
16.10.2017
14:02:50
окей. Тогда хочу готовую унифицированную функцию в стандарте
унифицированная функция не контролирует default мапы

Constantine
16.10.2017
14:03:03
окей. Тогда хочу готовую унифицированную функцию в стандарте
я хочу много таких функций в стандарте, но мне беркус предложит губозакаточный завод

Alexander
16.10.2017
14:03:11
с UCS будет вообще торт
ждём, надеемся

Constantine
16.10.2017
14:03:16
is_null (создано по конструктору из nullptr), get, get_or_default, ...

Alexander
16.10.2017
14:03:31
Constantine
16.10.2017
14:03:40
is_null_or_true

а что, мапе завезли подмену default конструктора элемента?

Alexander
16.10.2017
14:04:45
нет

Evgeniy
16.10.2017
14:04:49
Constantine
16.10.2017
14:05:07
а почему нельзя этот конструктор объявить конструктором класса?

все равно это часть информации о ТИПЕ мапы

Constantine
16.10.2017
14:05:29
наследуй если не твой

Alexander
16.10.2017
14:05:39
а я не хочу, потому что оверкилл, очевидно

Constantine
16.10.2017
14:05:59
почему? это strict type alias, в C++ он без наследования не реализуется

а ты хочешь фабрику шаблонным параметром мапы?

это не оверкилл?

Google
Evgeniy
16.10.2017
14:06:18
блин мне надо всего лишь замапить класс к интам от 0 и возвращать -1 если в мапе такого нет

Дед Пегас
16.10.2017
14:06:26
:D

Alexander
16.10.2017
14:06:35
Constantine
16.10.2017
14:06:56
ну get_or_default(std::map<smth, int> const& mp, int default)

Alexander
16.10.2017
14:07:47
ну get_or_default(std::map<smth, int> const& mp, int default)
это и было предложено и написано ТСом. Просто хочется что-то готовое уже аля map.get_with_default(key, 42);

Evgeniy
16.10.2017
14:08:04
к этому и пришел

Constantine
16.10.2017
14:08:28
это и было предложено и написано ТСом. Просто хочется что-то готовое уже аля map.get_with_default(key, 42);
да, я ключ забыл) можно так, да, но я бы не принял такое в стандарт

Alexander
16.10.2017
14:08:40
Tema
16.10.2017
14:08:50
какой самый некривой способ сделать дефолтное значение в std::map<something, int>, отличное от 0?
у меня есть такой класс, я как раз думал как бы дефолт вернутть, можно возвращать пару где будет флаг валидности значения и значение

Constantine
16.10.2017
14:08:53
костыли-костылята
это не костыль, я выше писал, внешние функции - лучшая архитектура

Constantine
16.10.2017
14:09:00
то же самое, что key_set в std не запихали, кстати

Tema
16.10.2017
14:09:05
ибо -1 это тоже может быть коректным клюдчём в енуме же

Evgeniy
16.10.2017
14:09:27
это не костыль, я выше писал, внешние функции - лучшая архитектура
почему бы не сделать дефолт опциональным шаблонным параметром

Constantine
16.10.2017
14:09:38
Alexander
16.10.2017
14:09:58
Constantine
16.10.2017
14:10:02
потому что map<int, smth> значение типа smth не может быть шаблонным параметром

Alexander
16.10.2017
14:10:07
вот шаблоном я бы точно не хотел, наверное

Constantine
16.10.2017
14:10:14
+

Google
Alexander
16.10.2017
14:10:23
мапы с разными дефолтами - разные типы. нет уж, извольте

Evgeniy
16.10.2017
14:10:28
ну или параметром конструктора

Alexander
16.10.2017
14:10:31
с аллокаторами уже имеем такое

Evgeniy
16.10.2017
14:10:38
погорячился

Alexander
16.10.2017
14:10:45
я бы всё же метод хотел

Constantine
16.10.2017
14:10:52
параметром только конструктора фабрика быть не может, её тип не определен

Alexander
16.10.2017
14:11:01
ну а лучше всего - своболдная функция + UFCS

Admin
ERROR: S client not available

Anatoly
16.10.2017
14:11:57
функция тоже есть, но она модифирующая try_emplace. в С++17 завезли.

Evgeniy
16.10.2017
14:12:47
Anatoly
16.10.2017
14:12:55
пару

Evgeniy
16.10.2017
14:13:34
как-то некрасиво все равно

☹️

Constantine
16.10.2017
14:14:16
а вообще я в архитектуре за унифицированные внешние отглагольные функции) т.е. моя реализация template <typename A, typename V [, ...]> V get_or_default(std::map<A, V> const& mp, A const& a, V v = {}) { auto it = mp.find(a); if (it != mp.end()) return it->second; return v; }

вот так, видимо

Anatoly
16.10.2017
14:15:14
поскольку, нечаянный m["key"] не вернет -1

Constantine
16.10.2017
14:15:41
m["key"] не const

Google
Constantine
16.10.2017
14:15:49
но если речь о том, что нужно перекрыть этот случай, выбора кроме агрегации/наследования просто нет

Anatoly
16.10.2017
14:16:06
или надо написать "хочешь получить значение мапы, но только через get_or_default"

Constantine
16.10.2017
14:16:07
потому что нужно новый тип мапы вывести

если это основной способ обращения - пишем type alias через агрегацию

больше путей в С++ не завезли

Anatoly
16.10.2017
14:17:11
Костя, ну вот есть пример у Страуструпа о подсчете числа вхождения слов. Все лаконично.

Кто-то хочет, чтобы добавление нового ключа через тот же оператор [] приводило к инициализации значения пары определенным значением. Вполне себе легальное желание.

Alexander
16.10.2017
14:17:47
Костя, ну вот есть пример у Страуструпа о подсчете числа вхождения слов. Все лаконично.
опа, очень интересно посмотреть. Особенно как он на C++ boost::split делает

Berkus
16.10.2017
14:19:58
Anatoly
16.10.2017
14:20:42
опа, очень интересно посмотреть. Особенно как он на C++ boost::split делает
да там все стандартно: std::map<std::string, size_t> m; std::for_each(std::istream_iterator<std::string>(std::in), std::istream_iterator<std::string>(), [&m](auto&& e) { ++m[e.first]; });

Alexander
16.10.2017
14:21:21
а, ясно-понятно

Constantine
16.10.2017
14:26:04
std::map<std::string, size_t> m; string s; while (cin >> s) ++m[s];

типичный олимпиадных исходник

Anatoly
16.10.2017
14:35:28
Ребят, так что на счет легальности?

еще можно через аллокатор кастомный, я пример набросал: https://ideone.com/Ui86F6

Constantine
16.10.2017
14:54:03
а всякие emplace таким аллокатором не ломаются?

на глаз очень не нравится template <typename U, typename...Args> void construct(U* ptr, Args&&... args) { alloc_traits::construct(static_cast<A&>(*this), ptr, std::forward<Args>(args)...); initializer<U>::init(ptr); }

Anatoly
16.10.2017
15:08:41
а всякие emplace таким аллокатором не ломаются?
да, emplace таким аллокатором ломается

Страница 1408 из 2477