![]() ![]() |
|
1 | |
Вопрос по std::map08.05.2010, 20:13. Просмотров 8986. Ответов 27
Метки нет Все метки)
(
В качестве хэш-таблицы для строк (AnsiString) я использовал std::map. От таблицы мне нужно было ещё и такое свойство: я хотел иметь информацию о том, присутсвует данный ключ в таблице или нет. В описании std::map сказано, что оператор [] ВСЕГДА создаёт элемент в таблице. В случае со String'ами такой проблемы как таковой не было, потому как даже если элемент создаётся в таблице, то он создаётся через Default'ный конструктор. Далее я беру элемент таблицы map[key] и проверяю, пустая там строка или нет.
Теперь мне нужно такое же свойство для bool (элементы таблицы являются Bool'ами). Эмпирически выглядит так, что для элемента, который я в таблицу не записывал, чтение всегда возвращает false. Но у меня нет уверенности, что сие будет так всегда. std::map - это всё-таки шаблон, а потому со всеми типами он работает одинаково и создание новой записи в таблице - это создание нового объекта через defeult'ный конструктор, который для базовых типов ничего делать не должен (т.е. элемент должен остаться неинициализированным). Техническая реализация может выглядеть таким образом, что перед созданием нового экземпляра класса в таблице память под него забивается нулями и только потом дергается new с указанием того, что объект нужно создать не абы где, а именно в этом участке памяти. Тогда для всех базовых типов реально всё по умолчанию будет обнулено А что по этому поводу говорит стандарт? Просто я в Си++ как-то не силён Добавлено через 1 минуту Вариант-затычку, что вместо bool я могу сделать string и по факту, инициализирована строка или нет, трактовать это как true или False, не предлагать, ибо я сам пока могу до этого додуматься
0
|
|
08.05.2010, 20:13 | |
переписать std::map Изменить std::map Обход элементов std::map в порядке их создания |
|
бжни
2469 / 1679 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
08.05.2010, 20:29 | 2 | |||||
я правильно понял, что вы хотите?
1
|
![]() ![]() |
|
08.05.2010, 20:46 [ТС] | 3 |
Хм... т.е. грубо говоря есть штатный способ, чтобы проверить, есть такой элемент или нет. Так чтоли? Т.е. для моей задачи это в принципе годится.
Но вопрос про инициализацию несуществующего значения остаётся. Если ответ на него утвердительный, то можно будет обойтись без find
0
|
бжни
2469 / 1679 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
08.05.2010, 20:52 | 4 |
есть подозрение, что произвольное, потому что ничего вразумительного в описании, ибо для классов все понятно - вызывается конструктор по умолчанию, тут видно от реализации библиотеки будет зависить
и все-же, мне кажется использовать operator[] для проверки наличия ключа не очень удобно, тк с каждой проверкой он будет усиленно добавлять новые элементы, если вы их конечно не используете сразу для своих нужд
0
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
08.05.2010, 21:20 | 5 |
Для стандартных типов конструктор по умолчанию инициализирует их нулями.
0
|
![]() ![]() |
|
08.05.2010, 21:31 [ТС] | 6 |
Описывать свою программу долго, но это нормально, ибо всё равно элемент с этим ключом заведётся (после проверки)
Вопрос я задал из тех соображений, что может кто-то стандарт Си++ хорошо знает, ибо вопрос в первую очередь к ним С каких это пор? Что-то впервые такое слышу
0
|
бжни
2469 / 1679 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
08.05.2010, 21:34 | 7 |
0
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
08.05.2010, 21:48 | 8 |
0
|
![]() ![]() |
||||||
08.05.2010, 21:59 [ТС] | 9 | |||||
alex_x_x, в 5'м посту говорилось про конструкторы базовых типов. Конструктор для int'а не инициализирует нулём. Или всё-таки инициализирует?
Если взять вот такой исходник:
Если vector<int> заполняет нулями, то один из возможных способов - который я описывал в первом посте. Вопрос в том, должно ли это делаться по стандарту? Добавлено через 4 минуты А можешь ткнуть носом в стандарт? Или конкретный пример для подтверждения своих слов. Я привёл исходник, глядя на код от которого я вижу, что инициализации не делается
0
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
08.05.2010, 22:04 | 10 |
int main()
{ int a = int(); double b = double(); float c = float(); cout << a << "\t" << b << "\t" << c << endl; system("pause"); return 0; } Простая проверка, можеш так же сделать для остальных типов
1
|
![]() 2331 / 1704 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
08.05.2010, 22:14 | 11 |
1
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
08.05.2010, 22:16 | 12 |
int a; резервирует память для инта, но никак не инициализирует значение, а конструктор дергается руками (хотя сам никогда не вызывал конструктор для стандартных типов и в чужом коде не видел)
0
|
бжни
2469 / 1679 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
08.05.2010, 22:23 | 13 |
могу понять int a(10); //int a = 10
это отвечает аналогии с пользовательскими классами, но int a = int(); работает, но как-то стремно выглядит, логичней былоб int a() - но так не работает)
0
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
08.05.2010, 22:26 | 14 |
int a(); - функцию не напоминает?
![]()
0
|
бжни
2469 / 1679 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
08.05.2010, 22:27 | 15 |
да не особо, каким образом?
..мне компилятор тоже самое сказал
0
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
08.05.2010, 22:29 | 16 |
Конструкторы для стандартных типов - это надстройка плюсов, но реально используются механизмы С
0
|
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
|
|
08.05.2010, 22:37 | 18 |
Контейнерам не особо важно какой тип им подали
![]()
0
|
бжни
2469 / 1679 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
08.05.2010, 22:38 | 19 | |||||
просто оно компилируется, но ни разу такого не видел
0
|
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
08.05.2010, 22:43 | 20 |
int();
Это вообще напоминает создание временного~безымянного объекта: для инициализации другого объекта. В работе с объектами не встроенных типов, я знаю, где такую примочку можно делать, и от нее больше польза, не желе здесь. Зачем так ивзращаться, когда можно просто int a(0); Добавлено через 3 минуты Извиняюсь что не в тему
0
|
08.05.2010, 22:43 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map? Теоретический вопрос по std::map Emplace в std::map. Как добавить элемент в std::map без копирования?
Стоит ли очищать в деструкторе std::map , std::vecotor? std::map, std::vector и порядок обхода коллекции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |