stl map

起因

最近在学习opengl中blend 一节时候,遇见了如下代码:

std::map<float, glm::vec3> sorted;
for (GLuint i = 0; i < windows.size(); i++) // windows contains all window positions
{
    GLfloat distance = glm::length(camera.Position - windows[i]);
    sorted[distance] = windows[i];
}

当时并不明白map到底是什么东西,随后便了解了一下。

什么是 stl map

map是STL的一种关联容器,类似与哈系表,提供一对一的数据处理能力(其中第一个字称为 关键字, 且每个关键字只能在map中出现一次;第二个数据 是关键字所对应的值)。map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

map的简单用法

一. map构造

template < class Key, class T, class Compare = less<Key>,  
      class Allocator = allocator<pair<const Key,T> > > class map;

key:关键值的类型。在map对象中的每个元素是通过该关键值唯一确定元素的。

T:映射值的类型。在map中的每个元素是用来储存一些数据作为其映射值
例如: std::map<float, glm::vec3> sorted; std::map<int, string> mapStudent;

二. 数据插入

1.pair 插入

 //pair 方式插入数据        
        mapStudent.insert(pair<int,string> (1,"xiao ming"));
        mapStudent.insert(pair<int,string> (2,"xiao li"));
        mapStudent.insert(pair<int,string> (3,"xiao jia"));

2.数组方式

 mapStudent[1] =  "student_one";
 mapStudent[2] =  "student_two";
 mapStudent[3] =  "student_three";

第一节opengl中所用到的就是以数组的方式插入数据。

map遍历 与 查找

1.前向迭代器

        map<int, string>::iterator  iter;
        for (iter = mapStudent.begin();iter != mapStudent.end();++iter)
        {
                cout<<iter->first<<"  "<<iter->second<<endl;
        }

2.反向迭代器

        map<int,string>::reverse_iterator iter2;
        for(iter2 = mapStudent.rbegin(); iter2 != mapStudent.rend();++iter2)
        {
                cout<<iter2->first<<"  "<<iter2->second<<endl;         
        }

3.数组的方式遍历

 /* 遍历3:数组方式 。 这种方式只是适合key值是顺序排列的*/
        for (int i = 1; i <= size; i++)
        {
                cout<<mapStudent[i]<<endl;
        }

4.find查找

        map<int,string>::iterator find;
        find = mapStudent.find(2);
        if(find != mapStudent.end())
        {
                cout<<"the value is:"<<find->second<<endl;

        }

观察发现:用find查找数据,返回值是 map的迭代器,如果map中没有要查找的数据,则返回的迭代器为end函数返回的迭代器。

整合程序:

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main ()
{
        map<int,string> mapStudent;

        //pair 方式插入数据
        /*
        mapStudent.insert(pair<int,string> (1,"xiao ming"));
        mapStudent.insert(pair<int,string> (2,"xiao li"));
        mapStudent.insert(pair<int,string> (3,"xiao jia"));
        */
          //数组的方式
        mapStudent[1] =  "student_one";
        mapStudent[2] =  "student_two";
        mapStudent[3] =  "student_three";

        /* map的遍历 1:前向迭代器 */
        map<int, string>::iterator  iter;
        for (iter = mapStudent.begin();iter != mapStudent.end();++iter)
        {
                cout<<iter->first<<"  "<<iter->second<<endl;
        }


        /* 遍历 2:反向迭代器 */
        map<int,string>::reverse_iterator iter2;
        for(iter2 = mapStudent.rbegin(); iter2 != mapStudent.rend();++iter2)
        {
                cout<<iter2->first<<"  "<<iter2->second<<endl;         
        }
        
        //获取数据的大小(个数)
        int size = mapStudent.size();
        cout<<size<<endl;
        
        /* 遍历3:数组方式 。 这种方式只是适合key值是顺序排列的*/
        for (int i = 1; i <= size; i++)
        {
                cout<<mapStudent[i]<<endl;
        }
        
        /*  查找 find。返回的是迭代器 */
        map<int,string>::iterator find;
        find = mapStudent.find(2);
        if(find != mapStudent.end())
        {
                cout<<"the value is:"<<find->second<<endl;

        }
        
        return 0;
}
    原文作者:SimpleTriangle
    原文地址: https://segmentfault.com/a/1190000008425576
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞