Разбор кода Nebula Device2. Часть3. Контейнеры (статья 3 - Строковый список и хэш-таблица)
Автор: graveman
Строковый список и хэш-таблица
У небулы есть класс строкового нода, строкового списка и хэш-таблицы. Их и рассмотрим в этой статье.
Класс nStrNode отличается от класса nNode наличием объекта типа nString с названием, говорящим само за себя, name. По всей видимости, разработчикам понадобился класс списка, к элементам которого можно обращаться по именам. Рассмотрим операции. В конструктор можно передать сишную строку - это инициализирует внутренний объект name. Можно передать сразу и C-строку, и указатель на void:
struct Dummy{} dummy; nStrNode n1; nStrNode n2(&dummy); nStrNode n3( “Unknown”); nStrNode n4( “I am dummy”, &dummy);
Если нужно изменить имя нода или задать его позже, то для этого предназначен метод SetName(), принимающий сишную строку и не возвращающий никаких значений. Чтобы узнать имя нода, вызовите через его объект или указатель метод GetName(), который и возвратит вам сишную строку с именем нода или нуль, если имя еще не было задано.
nStrNode n; n.SetName(“Hello, world”); printf( n.GetName( ));
> “Hello, World”
Методы GetSucc()/GetPred() претерпели несущественные изменения, заключающиеся в преобразовании указателя, возвращаемого одноименными методами класса nNode, в указатель на nStrNode.
Класс nStrList - это расширение класса nList для работы с именнованными нодами. Методы GetHead(), GetTail(), RemHead(), RemTail() - это обертки над одноименными методами класса nList, которые перед возвращением указателя преобразовывают его в указатель на nStrNode. Для поиска элемента по имени, предназначен метод Find(), который заключается в неэффективном переборе элементов и сравнении их имен с заданной C-строкой. Ну с точки зрения понятности и уменьшения количества кода эффективность то возросла. Позже будет рассмотрен специальный вид списка, в котором разработчики решили в какой-то степени проблему неэффективного поиска элементов по их имени.
Демо1: