您的位置:

C++中的STL容器之cppmap详解

一、cppmap概述

在C++的STL(标准模板库)中,map是一个非常重要的容器,也是应用最广泛的容器之一。map容器是一种关联式容器,其底层是采用红黑树实现的,可以对元素进行快速的插入、删除和查找等操作。map容器提供了一个键值对映射的机制,可以通过给定的键查找对应的值,类似于字典。因此,map容器也被称为字典容器。

map容器支持大量的操作,如:插入元素、访问元素、删除元素、遍历容器等等,其中最常用的操作是访问元素和插入元素。在map容器中,元素是以键值对的形式存在的,其中键是不可重复的,值可以重复。这也就意味着,我们可以通过键快速地查找到对应的值,而不需要像数组或链表那样遍历搜索。

下面是一个简单的map容器的例子:

#include 
#include 
   

using namespace std;

int main() {
    map
     score_map;
    score_map["Tom"] = 85.5;
    score_map["Jerry"] = 90.0;
    score_map["Mary"] = 78.5;
    
    cout << "Tom's score is " << score_map["Tom"] << endl;
    cout << "Jerry's score is " << score_map["Jerry"] << endl;
    cout << "Mary's score is " << score_map["Mary"] << endl;
    
    return 0;
}

    
  

以上代码定义了一个名为score_map的map容器,其键是字符串类型,值是双精度浮点数类型。然后在map容器中插入了三个元素,即三个键值对。最后通过键访问每个元素的值并输出。

二、map容器的基本操作

1、插入元素

map容器提供了多种插入元素的方法,常用的方法有:

  • 使用insert()函数插入元素,语法如下:
map map_name;
map_name.insert(pair
   (key_value, value)); 

   
  

其中,key_type为键的类型,value_type为值的类型,map_name为map容器的名称,key_value为键的值,value为对应的值。

  • 使用数组下标([])插入元素,语法如下:
map_name[key_value] = value;

其中,map_name为map容器的名称,key_value为键的值,value为对应的值。

2、访问元素

map容器提供了多种访问元素的方法,常用的方法有:

  • 使用数组下标([])访问元素,语法如下:
map_name[key_value];

其中,map_name为map容器的名称,key_value为键的值。

  • 使用find()函数访问元素,语法如下:
map_name.find(key_value)->second;

其中,map_name为map容器的名称,key_value为键的值。

3、删除元素

map容器提供了多种删除元素的方法,常用的方法有:

  • 使用erase()函数删除元素,语法如下:
map_name.erase(key_value);

其中,map_name为map容器的名称,key_value为键的值。

  • 使用clear()函数清空容器,语法如下:
map_name.clear();

其中,map_name为map容器的名称。

4、遍历容器

map容器提供了多种遍历容器的方法,常用的方法有:

  • 使用iterator迭代器遍历容器,语法如下:
map::iterator it;
for(it = map_name.begin(); it != map_name.end(); ++it) {
    cout << it->first << " : " << it->second << endl; 
}

  

其中,map_name为map容器的名称,key_type为键的类型,value_type为值的类型,it为迭代器,it->first表示获取当前元素的键,it->second表示获取当前元素的值。

三、常见问题与解决方法

1、如何判断元素是否存在?

可以使用count()函数来判断元素是否存在,如果元素存在,则count()函数返回1,否则返回0。

if(map_name.count(key_value)) {
    //元素存在
} else {
    //元素不存在
}

2、如何避免map容器中键值对的重复插入?

可以使用insert()函数的返回值来判断是否插入成功。如果插入成功,则返回一个pair类型的值,其第二个值为true;如果插入失败,则返回一个pair类型的值,其第二个值为false。

pair
   ::iterator, bool> ret;
ret = map_name.insert(pair
    (key_value, value));
if(!ret.second) {
    //插入失败
} else {
    //插入成功
}

    
   

3、如何按照键值对中的键或值进行排序?

可以使用STL中的sort()函数来对map容器中的元素进行排序。在sort()函数中,可以自定义比较函数,用于指定按照键或值进行排序。

bool sort_by_key(const pair& a, const pair
   & b) {
    return a.first < b.first;
}

bool sort_by_value(const pair
    & a, const pair
     & b) {
    return a.second < b.second;
}

map
       score_map;
score_map.insert(pair
       
        (1, 85)); score_map.insert(pair
        
         (2, 90)); score_map.insert(pair
         
          (3, 78)); vector
          
           
            > score_vec(score_map.begin(), score_map.end()); //按键升序排序 sort(score_vec.begin(), score_vec.end(), sort_by_key); //按值升序排序 sort(score_vec.begin(), score_vec.end(), sort_by_value);
           
          
         
        
       
      
     
    
   
  

4、如何使用自定义类型作为键或值?

可以使用自定义类型作为键或值,需要重载运算符<和==,并且满足严格弱序关系。

class Student {
public:
    string name;
    int age;
    bool operator < (const Student& other) const {
        //按照年龄从小到大排序
        return age < other.age;
    }
    bool operator == (const Student& other) const {
        return name == other.name && age == other.age;
    }
};

map score_map;
Student s1 = {"Tom", 18};
Student s2 = {"Jerry", 20};
score_map[s1] = 85.5;
score_map[s2] = 90.0;

  

四、总结

在C++的STL中,map容器是非常重要的容器之一,可以实现键值对的快速访问、插入和删除等操作。map容器是一个关联式容器,使用红黑树实现的,具有自动排序的特点,可以按照键或值进行升序或降序排序。同时,map容器也支持自定义类型作为键或值,需要重载运算符<和==。