|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
Изменить std::map08.12.2019, 15:06. Показов 5640. Ответов 42
Метки нет (Все метки)
Приветствую всех. Мне на работе приходится работать не совсем со свежим компилятором С++ и такой же старенькой библиотекой STL (там даже
auto_ptr не deprecated). Обновить все это хозяйство не возможно, поэтому приходится работать с тем, что есть.Я храню в std::map объекты своего класса. Так вот столкнулся с такой неприятной вещью, что при использовании оператора [] даже для существующего элемента вызывается конструктор по умолчанию. Сделав элементарный пример и проверив его на нескольких онлайн компиляторах я убедился, что такое поведение характерно только для моей STL.Открыв код std::map было обнаружено, что оператор [] это, по сути, обертка над методом insert. То есть, там не происходит проверки существует ли элемент, как, например, в библиотеке STL C++Builder.Поэтому такой вопрос. Могу ли я скопировать код файла map в файл, например my_map, добавить проверку в оператор [] и использовать этот свой файл для работы с std::map? Не возникнет ли в будущем каких-то неприятностей?
0
|
|
| 08.12.2019, 15:06 | |
|
Ответы с готовыми решениями:
42
переписать std::map Вопрос по std::map |
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|||||||||
| 10.12.2019, 10:12 [ТС] | |||||||||
Добавлено через 2 минуты
0
|
|||||||||
|
Комп_Оратор)
|
||||||||
| 10.12.2019, 11:30 | ||||||||
|
Я покажу как можно привести пример. Смотрите:
Вот об этом я хотел услышать.
0
|
||||||||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||||||||
| 10.12.2019, 12:01 [ТС] | ||||||||
![]() Ну да ладно. Беру Ваш пример (чуть изменил, добавив cout-ов) и запускаю у себя (на своем компиляторе и "той самой" STL). Привожу результат работы кода онлайн компилятора и моего.Запускаемый код: Кликните здесь для просмотра всего текста
Онлайн компилятор: Кликните здесь для просмотра всего текста
mama
papa Bar() left value Bar() right value mama Мой компилятор: Кликните здесь для просмотра всего текста
mama
papa Bar() left value Bar() Bar(const Bar &) Bar(const Bar &) right value Bar() Bar(const Bar &) mama
0
|
||||||||
| 10.12.2019, 13:15 | |
|
Не по теме: d7d1cd, это у вас там случайно не VS 6?
0
|
|
| 10.12.2019, 13:18 [ТС] | ||||||
|
Не по теме: DrOffset, нет. Операционная система IBM i. Если интересно, ниже содержимое файла map. Копирайт 1998 года :D. Кликните здесь для просмотра всего текста
0
|
||||||
|
фрилансер
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,375
|
|
| 10.12.2019, 13:26 | |
|
ого, триграфы о_О
0
|
|
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|
| 10.12.2019, 14:04 | |
|
Не по теме: d7d1cd, это поведение, конечно, баг. Я такое встречал в каких-то других реализациях, дело было давно. Добавлено через 2 минуты
1
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 10.12.2019, 14:19 [ТС] | ||
|
Надеюсь, реализация заплатки годная...
1
|
||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|||||||
| 10.12.2019, 14:31 | |||||||
0
|
|||||||
|
Комп_Оратор)
|
|
| 10.12.2019, 15:17 | |
|
d7d1cd, эта библиотека написана корифеями. Вот как плохо жиреть на военных заказах... Я бы предложил отказаться от оператора индексации. И обязательно искать, сначала (см. выше).
Можно ещё поработать с указателями в качестве значений (придётся написать предикат на сравнение указателей) и переписать всё, что работало со значениями. Поэтому проще предварять insert поиском и использовать итератор подсказки если пара не найдена (upper_bound) и если найдена то удаляем её и вставляем новую или переписываем значение в паре, в зависимости от поддержки в классе значения. Тут также, есть выбор, - оставить прежнее без изменения, чего оператор[] не предоставляет. Это должно работать быстрее чем оператор [].
0
|
|
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
|
| 10.12.2019, 15:25 [ТС] | |
|
IGPIGP, скажите, а чем плох метод переопределения оператора []?
0
|
|
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|
| 10.12.2019, 15:59 | |
|
d7d1cd, я вам даже больше скажу, во времена, когда ваша версия компилятора и библиотеки были актуальными - в С++ сообществе вовсю практиковалась замена STD на стороннюю, потому что стандартная часто не выдерживала критики.
Так родился, например, такой продукт как STLPort, ныне почти полностью позабытый.
1
|
|
|
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
|
||
| 10.12.2019, 16:27 | ||
![]() Искал инфу с доводами против наследования от стандартных STL контейнеров - есть те кто считает это неправильным в силу того что стандартные контейнеры не проектировались для наследования (у них нет, как минимум, виртуальных деструкторов), а есть и те кто считает это нормальной практикой. Нужно смотреть под какие нужды это делаеться и как будет использоваться и не возникнет ли в будущем проблем при работе с таким кодом. Кстати: boost program_options variables_map
1
|
||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
||||||
| 10.12.2019, 16:50 | ||||||
|
Я не знаю кто вбросил эту мысль про отсутствие виртуальных деструкторов как критерий неиспользования в качестве базовых классов, но эта дурь ходит по сети лет 20 точно. И каждое новое поколение новичков постоянно на это ссылается.
А дурь это потому, что для того, чтобы виртуальный деструктор имел значение - класс должен предполагать полиморфное использование. И мало того, полиморфное удаление. У стандартных контейнеров нет ни одного виртуального метода, значит никакого полиморфного использования с ними не получится априори. И довод, что кто-то может сделать так:
Более того, если бы комитет поддерживал эту идею, то с приходом С++11 давно бы уже по-объявляли все стандартные контейнеры как final и закрыли вопрос. Но никто что-то этого делать не стал.
5
|
||||||
|
Комп_Оратор)
|
||
| 10.12.2019, 16:50 | ||
|
Кроме того, придётся перекомпилировать весь проект. Это иногда критический затык. Ну а проблемы с совместимостью с библиотеками, которые могут юзать этот класс и перспективой расширения кодовой базы тоже не радостны. Я бы не стал так делать. Можно переписать все критические места где вызывается оператор индексации и оно будет работать на всех компиляторах. Но это частное мнение, возможно есть варианты получше.
0
|
||
|
279 / 156 / 52
Регистрация: 30.06.2011
Сообщений: 1,712
|
||
| 11.12.2019, 08:37 [ТС] | ||
|
IGPIGP, по Вашему последнему посту. Я меняю поведение оператора [] в мапе только для использования в своем проекте. Этот проект будет и может работать только на конкретной системе. Код в стандартной библиотеке я не меняю (да и нет у меня авторизации на изменение этих файлов). Планирую все подобные баги STL в моей системе исправлять (видимо, как и тут, создавать наследников с переопределением кривых методов) и хранить в отдельных файлах. При необходимости использовать в заголовках их.
0
|
||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|
| 11.12.2019, 08:48 | |
|
d7d1cd, а если рассмотреть вариант полной замены STL на ту же STLPort? Она не только содержит меньше багов, но еще и быстрее работает. Если весь проект пересадить на нее, то он, возможно, станет работать лучше.
0
|
|
|
Комп_Оратор)
|
|||||||
| 11.12.2019, 12:34 | |||||||
Вы думаете без компаратора, карта не будет ущербна? Лучше уже затайпдефить карту каким-то промежуточным типом. Включить тайпдеф в условных директивах так чтобы можно было компилировать и так и эдак. И в варианте "'эдак" использовал бы включение объекта map. Да, - придётся переписать кучу тупого обёрточного кода. Но это не так уж и долго. Добавлено через 37 минут Но в принципе, я вас немного запутал. При прямом наследовании можно конечно похулиганить. Но стрёмно как-то Кликните здесь для просмотра всего текста
0
|
|||||||
|
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
|
|||||||
| 11.12.2019, 12:40 | |||||||
3
|
|||||||
| 11.12.2019, 12:40 | |
|
Обход элементов std::map в порядке их создания std::string, std::fstream, ошибка кучи Как проинициализировать std::stack<const int> obj ( std::stack<int>{} );
Где в настройках RAD Studio 10 Seattle изменить аргумент на -std=c99? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|