【C++ STL容器】map容器方法总结

一、前述

map容器为我们使用C++实现hash表带来了便捷。map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的,后边我们会见识到有序的好处。

二、map方法

  • 初始化和插入数据
//-----1、直接赋值
map<int,int> mp;
mp[0]=0;

//-----2、列表初始化
map<string,int> mp={
    {"string",1}, {"sec",2}, {"trd",3}
    };

//-----3、insert方法
map<string, int> m2;
m2.insert({ "abc", 1 });  
//使用pair类型
m2.insert(make_pair(string("def"), 2));
m2.insert(pair<string, int>(string("ghi"), 3));
  • 查找元素
//1、------find方法,判断key是否存在
map<int,int> mp;
map<int,int>::iterator iter = mp.find("123");

if(iter!=mp.end()){
            
}

//2、------直接使用key引用
mp["123"];


注意:如果使用mp["123"],其表达的含义为:如果存在该键值则直接返回对应value,如果不存在则增加该key值并自动初始化为 

  • 删除和清空
//1、------使用迭代器【区间或者单独】
iter = mp.find("123");
mp.erase(iter);


//2、------直接删除对应键值

int n=mp.erase("123");  //如果删除返回1,否则返回0


//3、------清空
mp.clear();   -------相当于 mp.erase(mp.begin(),mp.end());

三、关于unordered_map

优点 缺点
map

利用红黑树实现了元素有序

由于红黑树的建立,需要足够的空间存储节点,因此空间开销大
unordered_map 仅仅建立哈希表而不排序,在查找的时候非常迅速也不需要过多的空间开销 建表费时间;无序性使得部分map操作效率降低

四、关于vector<pair<...>>

vector<pair<... , ....>>的存储也是起到了一个模拟map的功能,但其不会严格地具有哈希表的一一映射和键值去重属性,其各种方法仍然遵循vector的规则,只是操作对象变成了pair

因此,其无法根据pair的某一个值直接查找到对应的pair元素或者根据某一元素直接排序,

我们需要重载operator 的比较运算符才可以实现。

以find为例,这里使用了find_if:

#include <iostream>
#include<vector>
#include<algorithm>

using namespace std;

// Functor
class isEqualALL {
public:
    explicit isEqualALL(int UserVal) : User(UserVal) {}
    bool operator() (const std::pair<int, int>& element) const {
        return element.second == User;
    }
private:
    const int User;
};

int main(int argc, char *argv[])
{
    vector<pair<int, int>> sortList;
    sortList = {
        pair<int, int>(1, 100),
        pair<int, int>(2, 200),
        pair<int, int>(3, 300),
        pair<int, int>(4, 400),
    };

    cout << "初始值:" << endl;
    for (auto &i : sortList) {
        cout << i.first << ":" << i.second <<endl;
    }

    int myUser[] = {200, 400};

    for (int i = 0; i < sizeof(myUser) / sizeof(int); i++) {

        auto it = std::find_if( sortList.begin(), sortList.end(), isEqualALL(myUser[i]));

        if (it != sortList.end()) {
            sortList.erase(it);
        }

        cout <<"第" << i + 1 << "次删除后:///" << endl;
        for (auto &i : sortList) {
            cout << i.first << ":" << i.second <<endl;
        }
    }
    return 0;
}

————————————————
版权声明:本代码来自CSDN博主「JustNow_Man」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/j_cou/article/details/83044739

猜你喜欢

转载自blog.csdn.net/weixin_57208584/article/details/127290876