map과 unordered_map의 사용 비교

unordered_map 클래스 템플릿과 맵 클래스 템플릿 모두 이러한 객체를 설명합니다: std::pair<const Key, value>로 구성된 가변 길이 컨테이너입니다. 이 컨테이너의 각 요소는 두 개의 객체, 즉 키 - 값을 저장합니다. 쌍.

지도

맵을 사용할 때 헤더 파일을 참조해야 합니다. ,它的类模板声明以及部分函数声明如下:

/**
 * 程序来自C++源码 bits/stl_map.h
 */
template<typename _Key,  // key 类型
        typename _Tp,    // value 类型
        typename _Compare = std::less<_Key>, // 用于比较两个元素的比较函数
        typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > > // 分配器,同样的描述了容器在内存管理上的细节,不应该自己来处理,除非写自己的容器
class map {
    
    
private:
    /// 将一个红黑树转换成 [multi]map.
    typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
    rebind<value_type>::other _Pair_alloc_type;

    typedef _Rb_tree<key_type, value_type, _Select1st<value_type>,
    key_compare, _Pair_alloc_type> _Rep_type;
};

맵 내부에는 레드-블랙 트리를 사용하여 데이터를 정리하므로 기본적으로 데이터 정렬이 구현되었습니다. 다음 예에서 볼 수 있듯이 기본적으로 키를 정렬하여 증분을 구현합니다.

int main() {
    
    
    map<int, string> mapper;
    mapper.insert(make_pair(0, "Alice"));
    mapper[1] = "Bob";
    mapper.insert(map<int, string>::value_type(2, "Candy"));
    for (auto &iter : mapper) {
    
    
        cout << iter.first << " - " << iter.second << endl;
        /*
         * >: 输出如下,很明显的,它们在 key 的排序上是递增排列的
         * 0 - Alice
         * 1 - Bob
         * 2 - Candy
         */
    }
}

그러나 맵은 저장 측면에서 더 많은 공간을 차지하는데, 레드-블랙 트리에서는 각 노드가 상위 노드와 하위 노드 사이의 연결을 추가로 저장해야 하므로 각 노드는 맵의 속성을 유지하기 위해 큰 공간을 차지합니다. 레드 블랙 트리.

순서가 없는_지도

헤더 파일에 <unordered_map>을 도입하여 사용하세요. unordered_map의 가장 큰 특징은 매핑 저장을 위해 해시 테이블(hash table, hash_table)을 사용하는 내부 구현이며 템플릿 클래스 선언 및 매개 변수는 다음과 같습니다.

/**
 * 程序来自STL源码 bits/unordered_map.h
 */
template<typename _Key,  // key 类型 
        typename _Tp,    // value 类型
        typename _Hash = hash <_Key>,     // 哈希函数
        typename _Pred = equal_to <_Key>, // 用于比较两者是否相同的函数
        typename _Alloc = allocator <std::pair<const _Key, _Tp>>> // 分配器,描述了容器在内存管理上的细节,不应该自己来处理,除非写自己的容器
class unordered_map {
    
    
};

unordered_map 내부에는 Hash Table을 사용하여 데이터를 정리하고 키 값인 key를 해시 테이블의 위치에 매핑하여 접근하는데, 해시 함수의 특성에 따라 요소 검색을 위한 unordered_map의 시간 복잡도는 O에 도달할 수 있습니다. (1) 그러나 요소 배열은 순서가 없습니다. 구체적인 예는 다음과 같습니다.

int main() {
    
    
    using namespace std;
    // 首先创建一个无序 map,它的 key 使用 int 类型,value 使用 string 类型
    unordered_map<int, string> unorderedMap;    
   
    // 三种插入新元素的方法,“茴”字有三种写法~
    unorderedMap.insert(make_pair(0, "Alice")); 
    unorderedMap[1] = "Bob";
    unorderedMap.insert(unordered_map<int, string>::value_type(2, "Candy"));
 
    // 对内部元素挨个输出
    for (auto iter = unorderedMap.begin(); iter != unorderedMap.end(); iter++) {
    
    
        cout << iter->first << " - " << iter->second << endl;
        /*
         * >: 输出如下,可以得知它们在 key 的排序上并没有顺序
         * 2 - Candy
         * 0 - Alice
         * 1 - Bob
         */
    }
}

unordered_map은 해시 테이블을 생성하기 때문에 처음 생성하는데 시간이 많이 걸리지만 질의 속도는 빠릅니다~ 일반적인 상황에서는 unordered_map을 사용하는데 문제가 없습니다.

요약하다

지도:

元素有序,并且具有自动排序的功能(因为红黑树具有自动排序的功能)
元素按照二叉搜索树存储的,也就是说,其左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值,使用中序遍历可将键值按照从小到大遍历出来
空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间
适用情况:对顺序有要求的情况下,如排序等

무순_지도:

元素无序。
查找速度非常的快。
哈希表的建立比较耗费时间
适用情况:对于查找问题
对于unordered_map或者unordered_set容器,其遍历顺序与创建该容器时输入元素的顺序是不一定一致的,遍历是按照哈希表从前往后依次遍历的
运行效率:unordered_map最高,而map效率较低但提供了稳定效率和有序的序列。

占用内存:map内存占用略低,unordered_map内存占用略高,而且是线性成比例的。

什么时候使用哪个? 需要无序容器,快速查找删除,不担心略高的内存时用unordered_map;有序容器稳定查找删除效率,内存很在意时候用map。

おすすめ

転載: blog.csdn.net/xiaojinger_123/article/details/127802340