STL容器——mapmultimap

    技术2022-07-10  134

    STL容器——map/multimap

    1、map/multimap概念

    map的所有元素都会根据元素的键值自动排序。map所有的元素都是pair,同时拥有键和值,pair的第一元素被视为键值,第二元素被视为值,map不允许两个元素有相同的键。不可以通过map 的迭代器改变map的键值,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。可以修改map的值map和list拥有相同的某些性质,当对它的容器元素进行新增或者删除操作时,操作之前的所有迭代器在操作结束依然有效。元素插入过程是按排序规则插入,不能指定插入位置。在插入操作和删除操作上比vector快。multimap和map的操作类似,唯一区别是multimap键值可重复map和multimap都是以红黑树为底层实现机制。

    2、map构造函数

    map<T1,T2> mapT;//map默认构造函数map(const map &mp);//拷贝构造函数map& operator=(const map &mp);//重载等号操作符map.swap(mp);//交换两个集合容器 map<int, string> mapA; map<string, float> mapB; mapA.insert

    3、map大小操作

    size();//返回容器中元素的数目empty();//判断容器是否为空 void test() { map<int,string> mapA; mapA.insert(pair<int,string> (3,"小红")); mapA.insert(pair<int,string> (4,"小花")); mapA.insert(pair<int,string> (5,"小明")); if (mapA.empty()) { unsigned long long Size = mapA.size(); cout << Size << endl; } }

    4、map插入元素操作

    mapA.insert(pair<int,string> (3,“小花”));//第一种mapA.insert(make_pair(2,“小明”));//第二种mapA.insert(map<int,string>::value_type(1,“小李”));//第三种mapA[3]=“小刘”;//第四种

    前三种采用insert()方法插入,返回值pair<iterator,bool>,若key已经存在,则报错,第四种若key已经存在,则修改。第四种方式性能比较差,插入3时,先在mapA中查找主键为3的项,若没有发现,则将一个键为3 ,值为初始值的对组插入到mapA中,然后再将值修改为“小刘”。若发现已经存在3这个键,则修改这个键对应的value。

    void test() { map<int,string> mapA; pair<map<int,string>::iterator, bool> result= mapA.insert(pair<int,string> (3,"小红")); int resultFirst =(result.first)->first; //3 string resltSecond = (result.first)->second;//"小红" bool resultS = result.second;//true pair<map<int,string>::iterator, bool> res = mapA.insert(map<int,string>::value_type(5,"小明")); if(!res.second) { cout << "插入失败" << endl; } mapA.insert(map<int,string>::value_type(4,"小花")); mapA[6] = "小刘"; //迭代器遍历 for(map<int,string>::iterator it=mapA.begin();it!=mapA.end();it++) { pair<int,string> pr = *it; int key = pr.first; string value = pr.second; } } map<T1,T2,less<T1>> mapA;//该容器是按值的升序排列元素的。默认方式map<T1,T2,greater<T1>> mapA;//降序

    5、map删除操作

    clear();//删除全部元素erase(pos);//删除pos迭代器处的元素,返回下一元素的迭代器erase(beg,end);//删除[beg,end)区间元素,返回下一元素的迭代器erase(key);//删除容器key为key的对组 void test() { map<int,string> mapA; mapA.insert(pair<int,string>(1,"小红")); mapA.insert(map<int,string>::value_type(2,"小明")); mapA.insert(make_pair(3,"小菜")); mapA[4] = "小花"; mapA.erase(mapA.begin());//删除第一个元素 mapA.erase(mapA.begin(),++(++mapA.begin())); mapA.clear(); }

    6、map查找操作

    map.find(key);//查找ky是否存在,若存在,返回该键的元素的迭代器,若不存在,返回map.end()map.count(keyElem);//返回容器key为keyElem的对组个数,对map来说,不是0就是1,对multimap来说有可能大于1lower_bound(keyElem);//返回第一个key>keyElem元素的迭代器upper_bound(keyElem);//返回第一个key<keyElem元素的迭代器equal_range(keyElem);//返回key=keyElem的上下限的两个迭代器 void test() { map<int,string> mapA; map<int,string>::iterator it = mapA.find(3); if (it ==mapA.end()) { cout << "没找到" << endl; } else { pair<int,string> pairA = *it; int ID = pairA.first;//int ID = it->first; string strName = pairA.second;//it->second; } } 例如: mapStu 是用 map<int,string>声明的容器,已包含{1,"小李"}{3,"小张"}{5," 小王"}{7,"小赵"}{9,"小陈"}元素。map<int,string>::iterator it; it = mapStu.lower_bound(5); //it->first==3 it->second=="小张" it = mapStu.upper_bound(5); //it->first==7 it->second=="小赵" it = mapStu.lower_bound(6); //it->first==5 it->second=="小王" it = mapStu.upper_bound(6); //it->first==7 it->second=="小赵"
    Processed: 0.038, SQL: 11