Это другой способ:
end=5
for i in $(bash -c "echo {1..${end}}"); do echo $i; done
Карта использует красно-черное дерево в качестве структуры данных, поэтому элементы, которые вы туда вставили, отсортированы, а вставка / удаление - это O (log (n)). Элементы необходимо реализовать как минимум operator<
.
hashmap использует хеш, поэтому элементы не отсортированы, вставка / удаление равно O (1). Элементы должны реализовывать как минимум operator==
, а вам нужна хеш-функция.
map
- красно-черное дерево, O(log(n))
время доступа. hash_map
(что не является стандартным, однако unordered_map
станет стандартным) использует (концептуально) хэш ключа в качестве индекса в массиве связанных списков, и, следовательно, имеет наилучшее время доступа O(1)
наихудший случай O(n)
.
Основным отличием является время поиска.
для немногих данных лучше карта
для большого количества данных лучше hashmap
в любом случае технические ответы, приведенные ранее, верны.
hash_map использует хеш-таблицу. Это "постоянное" время в теории. В большинстве реализаций используется хеш-таблица "столкновения". На самом деле происходит следующее:
Теория состоит в том, что если у вас достаточно большая таблица, операции выполняются с постоянным временем, то есть оно не зависит от количества имеющихся у вас элементов. На практике, конечно, чем больше у вас элементов, тем больше столкновений.
std :: map использует двоичное дерево. Нет необходимости определять хеш-функцию для объекта, только строго упорядоченное сравнение. При вставке он перемещается вниз по дереву, чтобы найти точку вставки (и есть ли какие-либо дубликаты) и добавляет узел, и, возможно, потребуется перебалансировать дерево, чтобы глубина листьев никогда не превышала 1. Время перебалансировки также зависит от глубины дерева, поэтому все эти операции - O (log N), где N - количество элементов.
Преимущества хеширования - сложность. Преимущества дерева:
Еще одна проблема с std::map
состоит в том, что он использует одну строго упорядоченную функцию сравнения, в то время как функция «сравнения», которая возвращает -1, 0 или 1, будет намного более эффективной, особенно с наиболее часто встречающейся функцией. используемый тип ключа std :: string, в котором уже реализована эта функция (это char_traits::compare
). (Эта неэффективность основана на предпосылке, что для проверки того, что x==y
, вы проверяете x<y
и y<x
, так что вы делаете два сравнения. Вы сделали бы это только один раз за поиск).