C++ STL容器之map操作
来源:互联网 发布:node.js能做什么 编辑:程序博客网 时间:2024/06/06 04:35
Map是STL的一个关联容器,它提供一对一的数据处理能力
其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可以称为关键字的值
map可以看作是一棵有序的红黑树,这棵树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的
map<int, string> mapStudent;
这里mapStudent有两个属性,int可表示为学生的学号,string可表示学生的姓名
数据的插入:
方法1:用pair<type1,type2>的方式插入
mapStudent.insert(pair<int, string>(1, "Student1"));mapStudent.insert(pair<int, string>(2, "Student2"));mapStudent.insert(pair<int, string>(3, "Student3"));
Map的迭代器声明时,数据类型也必须和map一致
//map迭代器的属性也必须一致map<int, string>::iterator itr1;for (itr1 = mapStudent.begin(); itr1 != mapStudent.end(); itr1++){cout << itr1->first << " " << itr1->second << endl;}
方法2:使用valueType构建键值对构建容器
map<int, string> mapStudent2;mapStudent2.insert(map<int, string>::value_type(4,"student4"));mapStudent2.insert(map<int, string>::value_type(5,"student5"));mapStudent2.insert(map<int, string>::value_type(6,"student6"));map<int, string>::iterator itr2;for (itr2 = mapStudent2.begin(); itr2 != mapStudent2.end(); itr2++){cout << itr2->first << " " << itr2->second << endl;}
方法3:使用数组来进行构建
map<int, string> mapStudent4;mapStudent4[1] = "student_one";mapStudent4[2] = "student_two";mapStudent4[3] = "student_three";map<int, string>::iterator iter;for (iter = mapStudent4.begin(); iter != mapStudent4.end(); iter++){cout << iter->first << " " << iter->second << endl;}
这三种方法中:第一种方法和第二种方法是一样的
但第三种方法可能会覆盖关键字对应的值
//覆盖的情况cout << endl << endl;mapStudent[1] = "student_five";for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) //容器遍历数据{cout << iter->first << " " << iter->second << endl;}
运行结果:
插入前
插入后
MAP的大小size:
cout << endl << endl;int nSize = mapStudent.size();cout << nSize << endl;
MAP的查找:
通过find()函数通过关键字查找,如果根据关键字找到了值,则返回数据所在位置的迭代器
如果map中没有要找的数据,则返回map中end位置的数据
//数据的查找cout << endl << endl;itr1 = mapStudent.find(5);if (itr1 != mapStudent.end()) {cout << itr1->first << " " << itr1->second << endl; //如果找到了数据,就返回当前数据//没找到,就返回末尾的数据}else {cout << "can not find the number" << endl;;}
数据的删除:
删除分为单个删除和成片删除
单个删除通过关键字删除单个值
成片删除则根据迭代器范围删除一片数据
bool isDelete = mapStudent.erase(2);for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) //容器遍历数据{cout << iter->first << " " << iter->second << endl;}cout << endl << endl << endl;/*成片删除*/mapStudent.erase(mapStudent.begin(), mapStudent.end());
全部删除的话:使用clear()函数
//map的清空mapStudent.clear();if (mapStudent.empty()) { //empty函数判断map是否为空cout << "The map has been empty!" << endl;}
排序:
STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去
解决方式:操作符重载
一个例子如下:
#include <algorithm>#include <string>using namespace std;typedef struct tagStudent{int stuNo; //学号string Name; //名字}Student,*PStudent;int main() {map<Student, int> studentGrades;Student stdOne;stdOne.Name = "AAA";stdOne.stuNo = 1;Student stdTwo;stdTwo.Name = "BBB";stdTwo.stuNo = 2;//此时程序报错,因为结构体Student大小无法比较studentGrades.insert(pair<Student, int>(stdOne, 90));studentGrades.insert(pair<Student, int>(stdTwo, 80)); system("PAUSE");return 0;}
如果要比较的话,得重载操作符
typedef struct tagStudent{int stuNo; //学号string Name; //名字bool operator < (const tagStudent& right) const {if (this->stuNo < right.stuNo) return true;if (this->stuNo == right.stuNo) {return this->Name.compare(right.Name) < 0;}return false;}}Student,*PStudent;
这样就可以运行了
阅读全文
0 0
- C++ STL容器之map操作
- C++STL之关联容器【map】【set】
- C++STL之map映照容器
- STL容器之map
- STL之Map容器
- STL之map容器
- STL之容器map
- STL容器之map
- 【STL】STL容器之map
- 【C++】STL常用容器总结之八:映射map
- STL之MAP关联容器
- STL关联容器之Map
- STL 之 map 关联容器
- STL学习之map容器
- STL学习之map容器
- STL容器之Map,MulitMap
- STL容器之map/multimap
- c++ STL 容器之 map
- JsonUtility解析Json
- CodeForces
- 内排序- 当有两种以上变元的时候的贪心算法
- Gym
- deeplearn.js API用例(二)softmax的手动实现(解决Softmax backprop is not yet implemented问题)
- C++ STL容器之map操作
- JavaScript之Promise实现
- 数据结构--树、森林和二叉树的转换
- 形参和实参是什么?
- Java实现平衡二叉树(AVL树)
- opencv3/C++图像滤波实现
- 区分识别机器学习中的分类与回归
- Android 利用Zxing实现扫描二维码并跳转详情页面
- ajax spring security 被误伤