crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
AXELman4ever
  опции профиля:
сообщение 28.9.2011, 17:14
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 22.9.2011
Пользователь №: 2902

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день!

Читаю книгу Скотта Мейерса "Эффективное использование STL". В начале одной из глав, разделяющих понятия блоковых и узловых контейнеров, была замечена фраза: "К узловым контейнерам так же относятся все стандартные ассоциативные контейнеры"

Вопрос в следующем. По определению, узловой контейнер - это динамически выделенный фрагмент памяти, который содержит ровно один элемент.

Объясните пожалуйста на пальцах, как контейнер map, "элемент" которого обладает двумя значениями (ключ-значение) может относится к типу узловых контейнеров? Исходя из выше сказанного, я так понимаю, что ключ и значение хранятся в двух отдельных рядом стоящих фрагментах памяти :huh: Так ли это?

Расскажите кто знает. Заранее благодарен ;)

Прошу прощения, ненароком создалось 2 одинаковые темы. Кнопочку, чтобы закрыть или удалить дубль я не нашел.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 28.9.2011, 20:25
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


насколько я понял из препарирования исходников, узел std::map имеет элементы:


        _Nodeptr _Left;    // left subtree, or smallest element if head
        _Nodeptr _Parent;    // parent, or root of tree if head
        _Nodeptr _Right;    // right subtree, or largest element if head
        value_type;    // the stored value, unused if head
        char _Color;    // _Red or _Black, _Black if head
        char _Isnil;    // true only if head (also nil) node


то бишь:

указатель на "левую" ветку красно-чёрного дерева (её содержимое "меньше" правой ветки - по определению operator<() )
указатель на родительский узел
указатель на "правую ветку"
значение-пара _Myval (содержит данные first и second) (кроме корневого узла)
цвет узла
флаг корневого узла

Сообщение отредактировал Алексей1153 - 29.9.2011, 7:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 28.9.2011, 21:56
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(AXELman4ever @ 28.9.2011, 20:14) *
содержит ровно один элемент

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

Сообщение отредактировал Iron Bug - 28.9.2011, 21:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AXELman4ever
  опции профиля:
сообщение 30.9.2011, 12:45
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 22.9.2011
Пользователь №: 2902

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 28.9.2011, 21:56) *
там же ничего не сказано про структуру этого элемента.


Именно потому я и решил спросить у знатоков :) Сложно разобраться в таких вещах без помощи окружающих.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 4.5.2025, 22:02