|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
27.01.2012, 12:51 | #1 |
Software Developer
Участник клуба
Регистрация: 01.03.2011
Сообщений: 1,098
|
map указателей на элемент контейнера
Доброе время суток -)
В общем, как обычно, возникла необходимость... Есть структура, скажем, S Код:
Код:
Надо сделать отображение, которое будет хранить в качестве ключа str, а в качестве значения -- указатель на соответствующий элемент вектора vectS. Пытаюсь сделать так: Код:
Код:
Но! Когда я пытаюсь "достать" элемент вектора, на который указывает (?) этот адрес, получаю Segmentation fault. При этом, если я делаю так: Код:
Если же я немного видоизменю вышеприведенную печать всего map'а Код:
Где грабли? Или мне надо брать "умные указатели"? Ну, например, вoost'овские shared_ptr?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв. Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062 Последний раз редактировалось Mandrivnyk; 27.01.2012 в 16:41. Причина: Исправил опечатку vectS* --> S* |
27.01.2012, 13:57 | #2 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
Mandrivnyk
// добавляю новый элемент в map mymap.insert(make_pair(tmpS.str, &vectS.back())); а не указатель ли на локальную переменную ты запихиваешь в мап? а вообще, наблюдается некая избыточность. str у тебя ключ, и также в структуре сидит. некошерно.
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
27.01.2012, 14:26 | #3 | ||
Software Developer
Участник клуба
Регистрация: 01.03.2011
Сообщений: 1,098
|
Цитата:
Но вроде бы нет... Или есть возможность это проверить? -) Цитата:
А вообще -- возможно, это связано с особенностью vector'а -- переаллоцировать для себя память в процессе выполнения программы. Другие контейнеры (deque, list и тот же map) этого не делают... Кстати, кроме shared_ptr есть еще и reference_wrapper от "того же производителя". Может, кто уже работал с чем-нибудь из них? Или вообще смотреть в сторону Pointer Container Library от все того же boost'а?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв. Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062 Последний раз редактировалось Mandrivnyk; 27.01.2012 в 14:47. |
||
27.01.2012, 14:46 | #4 |
Форумчанин
Регистрация: 27.04.2009
Сообщений: 184
|
по моему в место
Код:
Код:
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
|
27.01.2012, 16:36 | #5 | |
Software Developer
Участник клуба
Регистрация: 01.03.2011
Сообщений: 1,098
|
Цитата:
Для наглядности не копипастил с теми названиями, что у меня в проекте, а переименовал уже тут. Вот и получилось тут так криво. Но только тут =) А вообще -- таки да... Проблема именно с vector'ом. Простая замена на list сразу все исправила. Но тем не менее, если кто использовал (вдруг) упомянутые мной в предыдущем посте библиотеки -- очень бы хотелось услышать отзывы и рекомендации -)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв. Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062 Последний раз редактировалось Mandrivnyk; 27.01.2012 в 16:40. |
|
27.01.2012, 17:54 | #6 | |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
Цитата:
Со списком у вас работает по той простой причине, что список не делает перемещение своих элементов. Вы могли бы использовать веторк, но только в отображении хранить не указатель на элемент вектора, а индекс элемента. При этом вам надо обечпечить синхронизацию операций по изменению последовательного контейнера и отображения.
Со мной можно встретиться на www.clipper.borda.ru
Последний раз редактировалось Сыроежка; 27.01.2012 в 17:57. |
|
27.01.2012, 18:11 | #7 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
Mandrivnyk
не зная полной задачи трудно сказать. вообще, по моему опыту, для каких-либо операций с индексами чуть сложнее чем примитивные, ничего лучше чем Boost.MultiIndex не видел
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
27.01.2012, 18:20 | #8 | |
Software Developer
Участник клуба
Регистрация: 01.03.2011
Сообщений: 1,098
|
Цитата:
Размер вектора мне становится известным в процессе выполнения программы -- я же парсю XML-файл; подсчитать количество нужных нод -- вот он и размер. И да, после прочтения и заполнения вектор остается неизменным до конца отработки программы (неизменным в смысле количества элементов вектора; значения полей могут меняться, по-крайней мере, одно). Вопрос в другом -- а стОит ли это (подсчет элементов и резервирование памяти) того, чтобы использовать именно вектор? И еще одно -- Джосьютис в своей книге "С++ Стандартная библиотека" советует смотреть именно в сторону shared_ptr, чтобы избежать потенциальных ошибок в случае, когда, например, указатель на элемент контейнера хранится в двух других независимых контейнерах -- как раз мой случай. Но у меня объекты контейнеров после инициализации (после парсинга XML-файла) остаются жить, как я написал выше, до конца работы программы. Меняется только поле в описанной структуре. Все остальное -- не более чем "виртуальный интерфейс доступа" к этому полю и _по этому полю_ (то есть, работающий в две стороны). Так что я не совсем уверен, нужно ли мне на самом деле использовать какие-либо "умные" указатели. Впрочем, хуже точно не будет =)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв. Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062 |
|
27.01.2012, 19:37 | #9 | |
Форумчанин
Регистрация: 01.07.2011
Сообщений: 423
|
Цитата:
Вы, например, могли бы выбрать модель, когда сначала заполняете вектор, а уж затем по готовому вектору строите отображение. Может быть вам вообще следует ограничиться одним вектором, который отсортировать по требуемому полю, а затем использовать двоичный поиск для доступа к его элементам.
Со мной можно встретиться на www.clipper.borda.ru
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Реализация контейнера map. | fabregas | Общие вопросы C/C++ | 11 | 19.04.2013 16:23 |
Как заменить элемент элемент одномерного массива? Паскаль | Женька Good | Помощь студентам | 5 | 21.12.2011 00:07 |
Одномерный массив. Необходимо заменить последний положительный элемент на второй элемент массива | кумитэ | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 19.12.2011 16:44 |
Не добавляется элемент в map | -LeV- | Общие вопросы C/C++ | 3 | 22.02.2011 19:36 |
Файловый ввод/вывод STL контейнера указателей | farynaa | Помощь студентам | 0 | 21.05.2010 22:29 |