暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++高级学习:第十三节-map容器

Cpp入门到精通 2024-03-13
176

点击蓝字 关注我们

c++高级学习

第十三节  map容器


      C++中的map容器是一种关联容器,它可以存储键值对的数据,每个键唯一地映射到一个值。在map容器中,键的类型和值的类型可以不同,但每个键都必须是唯一的。它的数据结构和上节介绍的set容器一样同样是基于红黑树实现。我们接下来看一下关于map容器的基本操作。


1.创建对象:

map容器创建对象,首先要包含头文件。

    #include<map>

    之后在创建的时候要注意map容器要创建一个存储键值对的对象。

      map<int,string>Stu;

      我们创建一个名为Stu的容器,键值对的类型为<int,string>,也就是说,键的类型是int,值的类型是string,他们共同组成了这个对象。接下来我们看一下它的具体操作。

      2.元素的增删操作

      我们可以使用数组去创建容器的具体对象,或者使用insert函数去插入对象。对于删除元素,我们可以使用erase函数

        map<int,string>Stu;
        //1.使用数组方式去创建具体对象
        Stu[1] ="Rose";
        Stu[2] = "Mary";
        //2.使用insert方式去插入具体对象
        Stu.insert(pair<int, string>(3,"WenTen"));
        //使用erase删除元素
        Stu.erase(3);

        我们使用erase删除了键值为3的元素,此时容器中还有两对元素。


        3.访问元素操作

        在map容器中,元素的访问主要通过键(key)来实现。使用键来访问map中的元素,可以通过下标操作符或者使用find函数

          map<int,string>Stu;
          Stu[1] ="Rose";
          Stu[2] = "Mary";
          Stu.insert(pair<int, string>(3,"WenTen"));
          cout << "Stu[3]:" << Stu[3] << endl;
          cout << Stu.size() << endl;
          cout << "Stu[4]:" << Stu[4] << endl;
          cout << Stu.size() << endl;

          在这里我们使用下标去查找键为3的元素,找到并返回它的值。接下来我们又查找键为4的值,但是我们的容器中并没有该对象。此时,我们将会自动创建键为4的对象,并将值默认为0,我们可以使用size去输出容器的大小来验证这一结论是否正确。

            Stu[3]:WenTen
            3
            Stu[4]:
            4

            我们发现,当查找键4的值,它的值为空的,此时容器的大小(元素个数)也发生了变化,说明系统默认创建了一个键为4的元素,值默认为0。

            我们使用find去查找元素:

              map<int, string>::iterator it = Stu.find(1);
              if (it != Stu.end()) {
              cout << "key=" << it->first<<"\t" << "value=" << it->second << endl;
              }
              else {
              cout << "未找到键值为2的元素" << endl;
              }

              find函数返回一个迭代器,指向键所在的位置,在这里我们指向了键为1的元素所在的位置。通过检查迭代器是否等于end(),可以判断是否找到了对应的键。我们可以使用成员访问运算符->来访问键值对中的成员,在这里我们使用it->first访问键,使用it->second访问值。

                key=1   value=Rose

                我们可以使用迭代器访问遍历输出容器中的所有元素。

                  for (map<int, string>::iterator it = Stu.begin(); it != Stu.end(); it++) {
                  cout << "Stu[" << it->first << "]" << "\t" << it -> second << endl;
                  }

                  结果如下:

                    Stu[1]  Rose
                    Stu[2] Mary
                    Stu[3] WenTen
                    Stu[4]

                    4.比较操作

                    我们在对map容器中的元素进行比较操作时,都是对进行比较,比如说:

                    1.upper_bound,用于在容器中找到大于给定值的第一个元素的迭代器

                      map<int, string>::iterator it = Stu.upper_bound(1);
                      if (it != Stu.end()) {
                      cout << "key=" << it->first<<"\t" << "value=" << it->second << endl;
                      }
                      else {
                      cout << "未找到键值大于1的元素" << endl;
                      }

                      结果如下:

                        key=2   value=Mary

                        2.lower_bound,用于在容器中找到大于等于给定值的第一个元素的迭代器。结果为:

                          key=1   value=Rose

                          我们在进行比较的时候首先要保证键是有序的,其实map容器本来就是按照键的顺序存储的,默认为升序。我们仍然可以使用上节同样的方式,使用自定义比较函数实现降序排列:

                            #include<iostream>
                            using namespace std;
                            #include<map>
                            class Mycompare
                            {
                            public:
                            bool operator()(int v1, int v2)const
                            {
                            return v1 > v2;
                            }
                            };
                            int main() {
                            map<int,string,Mycompare>Stu;
                            Stu[1] ="Rose";
                            Stu[2] = "Mary";
                            Stu.insert(pair<int, string>(3,"WenTen"));
                            for (map<int, string>::iterator it = Stu.begin(); it != Stu.end(); it++) {
                            cout << "Stu[" << it->first << "]" << "\t" << it->second << endl;
                            }
                            system("pause");
                            return 0;
                            }

                            结果如下:

                              Stu[3]  WenTen
                              Stu[2] Mary
                              Stu[1] Rose

                              map容器的相关操作的讲解到此结束,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!


                              END

                              往期推荐

                              C++高级学习:第十二节-set容器

                              C++高级学习:第十一节-stack&queue容器

                              C++高级学习:第十节-list容器(下)

                              C++高级学习:第九节-list容器(上)

                              分享、在看与点赞,至少我要拥有一个吧

                              文章转载自Cpp入门到精通,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                              评论