forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Болтовня (http://forum.boolean.name/forumdisplay.php?f=25)
-   -   Нравится/Не нравится C++ (из темы "Ваш первый раз") (http://forum.boolean.name/showthread.php?t=20261)

RegIon 13.04.2016 07:27

Ответ: Нравится/Не нравится C++ (из темы "Ваш первый раз")
 
Цитата:

Сообщение от h1dd3n (Сообщение 305466)
в плюсах можно получать из map то чего там нет и никогда не было ?

Эксепшен считается?
Недавно юзал map, в доках написано, что при обращении к несуществующей связке KeyPair кидается эксепшен. Что за хрень? Зачем сносить очередь выполнения эксепшеном из-за того, что я обратился по несуществующему ключу?

Проверял Map.FindKey-ем, который выдает итератор, который сравнивал с Map.end().
Ну вообще не удобно на самом деле тут вышло.

в С# можно обратится по несуществующему ключу и получить null для объектов.
https://msdn.microsoft.com/ru-ru/lib...vs.110%29.aspx

mr.DIMAS 13.04.2016 10:24

Ответ: Нравится/Не нравится C++ (из темы "Ваш первый раз")
 
Цитата:

Ещё какие-то _ptr , которые работают непонятно как и и с бубнами, главное работают?да и как вообще указатель может иметь разный вид, он же число, адресс в памяти, или концепции переменились уже давно-давно?

UPD. Ещё одна из 'удобных' оберток над числом
Ты бы хоть почитал про них для начала.

Вкратце unique_ptr освобождает память при выходе из области видимости\в деструкторе\ при выходе из приложения.

shared_ptr позволяет разделять владение указателем между разными участками приложения, и когда на сырой указатель больше никто не ссылается - он удаляется вместе с последним shared_ptr владеющим им. Очень удобная штука для управления ресурсами.

weak_ptr устраняет циклические зависимости, когда в объекте А есть shared_ptr<B>, а в объекте B есть shared_ptr<A>. Помимо этого этим указателем удобно проверять наличие ресурса, и загружать его по мере необходимости.

Mr_F_ 13.04.2016 10:51

Ответ: Нравится/Не нравится C++ (из темы "Ваш первый раз")
 
Цитата:

в плюсах можно получать из map то чего там нет и никогда не было ?
можно получать нуль.
типа

type value = mapa[key]; // один лукап
use(value);
if (value!=NULL)...
-----

шарпик:

type value = mapa[key]; // слови ошибку, если key нет
-----
if (mapa.ContainsKey(key)) { // первый лукап
type value = mapa[key]; // повторный лукап. зачем?
use(value);
...
} else {
use(null);
}
работает, но медленно

-----
type value = 0;
if (mapa.TryGetValue(key, out value)) {
use(value);
...
} else {
use(null);
}
работает, но некрасиво

ABTOMAT 13.04.2016 11:56

Ответ: Нравится/Не нравится C++ (из темы "Ваш первый раз")
 
А если я в Dictionary и хочу хранить нулль?
Тогда получается двусмысленность: либо там нулль из-за того, что нет такого ключа, либо нуль потому что я его туда положил.

Andvrok 13.04.2016 12:29

Ответ: Нравится/Не нравится C++ (из темы "Ваш первый раз")
 
Подхвачу мысль, у меня были ситуации, когда нужно было разграничивать отсутствие ключа и наличие ключа без значения.

h1dd3n 13.04.2016 19:15

Ответ: Нравится/Не нравится C++ (из темы "Ваш первый раз")
 
Цитата:

Сообщение от ABTOMAT (Сообщение 305473)
А если я в Dictionary и хочу хранить нулль?
Тогда получается двусмысленность: либо там нулль из-за того, что нет такого ключа, либо нуль потому что я его туда положил.

Плюсую.
А еще если немного поизучать C#/CLR, то обнаружится что типы бывают не только reference type (object, List, Bitmap и т.д., те которые хранятся в куче), но и value type (это те которые лежат на стеке). Думаете проблема "сохранил ли я null, или это null потому что там ничего не было" такая острая? Пример еще более проблемный:
Код:

Dictionary<string, bool> settings = settingsManager.GetSettings();

if (settings["setting1"]) {
    SaveSomething();
}

settings - словарь настроек в виде чекбоксов (да/нет)
В этом примере что должен вернуть словарь, если ключа setting1 нет и никогда не было? true? false? А вот и хер его знает. Поэтому такое поведение с исключением и существует. Dictionary - коллекция общего назначения, поэтому ее старались сделать так чтобы подходила к любым ситуациям в равной степени.
К слову, есть коллекции где поведение "вернуть null, если даже ключа нет" является приемлемым. Например, в ASP NET Session (по сути, тоже словарь).

И вообще, если тебе так нужно чтобы словарь возвращал значение по умолчанию, в случае отсутствия ключа - то взял бы да написал сам, там кода 10 строк один раз написать: https://dotnetfiddle.net/GXdtAS, для reference типов будет возвращать null, для value типов значение по умолчанию (для int 0, для bool false и т.д.)


Часовой пояс GMT +4, время: 11:55.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot