Пошаговая отладка с исходным кодом g++
6.4 stdlibc ++
Знаете ли вы, что в пакете g++-6
по умолчанию Ubuntu 16.04 или GCC 6.4 build from source вы можете перейти в библиотеку C ++ без дополнительной настройки?
Делая это, мы легко делаем вывод, что в этой реализации используется красно-черное дерево.
Это имеет смысл, поскольку std::set
можно обходить по порядку, что было бы неэффективно, если бы использовалась хэш-карта.
main.cpp
#include <cassert>
#include <set>
int main() {
std::set<int> s;
s.insert(1);
s.insert(2);
assert(s.find(1) != s.end());
assert(s.find(2) != s.end());
assert(s.find(3) == s3.end());
}
Компиляция и отладка:
g++ -g -std=c++11 -O0 -o main.out main.cpp
gdb -ex 'start' -q --args main.out
Теперь, если вы войдете в s.insert(1)
, вы сразу дойдете до /usr/include/c++/6/bits/stl_set.h
:
487 #if __cplusplus >= 201103L
488 std::pair<iterator, bool>
489 insert(value_type&& __x)
490 {
491 std::pair<typename _Rep_type::iterator, bool> __p =
492 _M_t._M_insert_unique(std::move(__x));
493 return std::pair<iterator, bool>(__p.first, __p.second);
494 }
495 #endif
который явно пересылается на _M_t._M_insert_unique
.
Итак, мы открываем исходный файл в vim и находим определение _M_t
:
typedef _Rb_tree<key_type, value_type, _Identity<value_type>,
key_compare, _Key_alloc_type> _Rep_type;
_Rep_type _M_t; // Red-black tree representing set.
Итак, _M_t
относится к типу _Rep_type
, а _Rep_type
- к _Rb_tree
.
Хорошо, теперь для меня достаточно доказательств. Если вы не верите, что _Rb_tree
является черно-красным деревом, сделайте шаг вперед и прочтите алгоритм.
unordered_set
использует хеш-таблицу
Та же процедура, но замените set
на unordered_set
в коде.
Это имеет смысл, поскольку std::unordered_set
не может быть пройден по порядку, поэтому стандартная библиотека выбрала хэш-карту вместо красно-черного дерева, поскольку хеш-карта имеет лучшую амортизированную временную сложность вставки.
Переход в insert
приводит к /usr/include/c++/6/bits/unordered_set.h
:
415 std::pair<iterator, bool>
416 insert(value_type&& __x)
417 { return _M_h.insert(std::move(__x)); }
Итак, мы открываем исходный файл в vim
и ищем _M_h
:
typedef __uset_hashtable<_Value, _Hash, _Pred, _Alloc> _Hashtable;
_Hashtable _M_h;
Итак, хеш-таблица.
std::map
и std::unordered_map
Аналогично std::set
vs std:unordered_set
: Какая структура данных находится внутри std :: map в C ++?
Тактико-технические характеристики
Вы также можете определить используемую структуру данных, рассчитав их:
![введите описание изображения здесь](https://i.stack.imgur.com/2Kcl0.png)
Процедура создания графика и анализ кучи и BST и по адресу: Куча против двоичного дерева поиска (BST)
Мы ясно видим:
person
Ciro Santilli 新疆再教育营六四事件ۍ
schedule
21.08.2018