Я читал, что стандартная карта реализована с использованием структуры данных двоичного дерева поиска.
BST - это последовательная структура данных (например, элементы в массиве), которая хранит элементы в узле BST и поддерживает элементы в их порядке. Например, если элемент меньше узла, сохраните его слева от узла, а если он больше узла, сохраните его справа от узла. При таком подходе мы достигаем сложности O (log n) для различных операций, таких как поиск, вставка и т. Д.
Однако карта std является ассоциированным контейнером. У нас есть пара ключей и значений для вставки. Реализовано ли это на самом деле с использованием BST, и если да, то как? В BST у нас нет ключа или значения. Это своего рода стандартный контейнер.
Я немного запутался. Пожалуйста, помогите мне дать разъяснения. Это не влияет на мою работу, но я хочу их лучше понять. Спасибо за вашу помощь.
2 ответа
Узел на карте обычно выглядит примерно так:
struct node
{
node* left;
node* right;
Key_type key;
Value_type value;
};
У вас есть общее представление о том, как работает BST, как вы сказали:
если элемент меньше узла, сохраните его слева от узла, а если он больше узла, сохраните его справа от узла.
В случае моей структуры node
"элементом" является член key
. Таким образом, ключи сравниваются, чтобы определить организацию дерева. Узлы, ключи которых сравниваются меньше, чем у родительского узла, помещаются слева, а узлы, ключи которых сравниваются больше, размещаются справа. value
не участвует в организации дерева, это просто дополнительные данные. Он связан с ключом, просто являясь частью той же структуры.
В стандарте C ++ нет ничего, что диктовало бы, как должен быть реализован std::map
. Следовательно, основная структура данных std::map
- это решение, которое должно быть принято разработчиком.
Однако большинство реализаций реализуют std::map
как красно-черное дерево.
std::map<>
остается на усмотрение реализации, если она компилируется в соответствии с правилами, установленными стандартом для (а) ассоциативных контейнеров (C++11 §23.2.4) и (б) конкретными дополнительными требованиями. и исключения для std::map<>
(C++11 §23.4.4).
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.