map
中每一个元素都是一个 key-value
对,数据类型为 pair
std::pair
主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。pair
实质上是一个结构体,其主要的两个成员变量是 first
和 second
,这两个变量可以直接使用。
初始化一个 pair
可以使用构造函数,也可以使用 std::make_pair
函数,make_pair
函数的定义如下:template pair make_pair(T1 a, T2 b) { return pair(a, b); }
一般 make_pair
都使用在需要 pair
做参数的位置,可以直接调用 make_pair
生成 pair
对象。
pair<string, int> student ("zhangsan", 17); // name-age
student.first = "zhangsan";
student.second = 17;
product3 = make_pair ("shoes",20.0);
Map、HashMap概念
-
Map
是STL
的一个关联容器,以键值对存储的数据,其类型可以自己定义,每个关键字在map
中只能出现一次,关键字不能修改。map
也可以说关于key-value
的映射。 -
HashMap
是基于哈希表实现的,每一个元素是一个key-value
对。以空间换时间,是存储key-value
键值对的集合。
map、hashmap 的区别
-
hash_map
底层采用hash
表存储,map
一般采用红黑树实现,所以hash_map
的key
值是无序的,map
存储是有有序的。 -
map
的优点在于可以自动按照Key
值进行排序,查找时间复杂度是log(n)
;hash_map
优点在于它各项操作的平均时间复杂度接近常数,即O(1).
引用头文件
#include <map>
初始化赋值
- 使用初始化列表初始化map,并添加若干键值对
std::map<KeyType, ValueType> myMap = {
{key1, value1},
{key2, value2},
// more key-value pairs
};
- 使用插入操作逐个添加元素到map中
std::map<KeyType, ValueType> myMap;
myMap.insert(std::make_pair(key1, value1));
myMap.insert(std::make_pair(key2, value2));
// more insertions
map 自定义 key 类型
如果要将自定义类型作为 map
的键值,将 less<key>
模板类示例化,重载 operator()
函数
另外,可以根据 less 自定义 对 key 值进行特定排序
参考:https://blog.csdn.net/qq525003138/article/details/121306663
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct student{
student(string str, int a) : name(str), age(a) {};
bool operator==(const student& stu2) const {
return stu2.name == name && stu2.age == age;
}
string name;
int age;
};
struct CompareClass {
public:
// 函数const限定修饰符一定不要丢,必须和less<Key> 模板类保持一致
bool operator()(const student& key1, const student& key2) const {
return key1.name == key2.name && key1.age == key2.age;
}
};
int main() {
struct student stu1 = {"zhangsan", 17};
map<student, string, CompareClass> students = {make_pair(stu1, "13班")};
for(auto x : students) {
cout<< x.first.name << " " << x.first.age << "岁 " << x.second << endl;
}
return 0;
}
map 的 value 自定义数据类型
unordered_map 的 value 自定义数据类型时,无特殊操作,按照常见数据类型操作即可文章来源:https://www.toymoban.com/news/detail-676605.html
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct student{
student(string str, int a) : name(str), age(a) {};
bool operator==(const student& stu2) const {
return stu2.name == name && stu2.age == age;
}
string name;
int age;
};
struct CompareClass {
public:
// 函数const限定修饰符一定不要丢,必须和less<Key> 模板类保持一致
bool operator()(const student& key1, const student& key2) const {
return key1.name == key2.name && key1.age == key2.age;
}
};
int main() {
struct student stu1 = {"zhangsan", 17};
map<string, student> students = {make_pair("13班", stu1)};
for(auto x : students) {
cout<< x.first << " " << x.second.name << " " << x.second.age << "岁 " << endl;
}
return 0;
}
遍历
- 迭代器遍历
for ( auto it = name_Address.begin(); it != name_Address.end(); ++it )
cout << " " << it->first << ":" << it->second;
- range for循环遍历
for ( auto x : name_Address )
cout << " " << x.first << ":" << x.second;
- 通过
key
索引
迭代器
迭代器只只支持 ++ --
操作文章来源地址https://www.toymoban.com/news/detail-676605.html
常用方法
方法 | 说明 |
---|---|
at(key) |
返回对与键 key 关联的映射值 |
begin( ) |
返回一个迭代器,它引用映射的第一个元素 |
end( ) |
返回一个迭代器,它指向映射中的 past-the-end 元素 |
cbegin( ) |
返回一个常量迭代器,它引用映射的第一个元素 |
cend( ) |
返回一个常量迭代器,它指向映射的 past-the-end 元素 |
rbegin( ) |
返回一个反向迭代器,它指向容器 i 的最后一个元素 |
rend( ) |
返回一个反向迭代器,它指向容器中第一个元素之前的理论元素。 |
count(key ) |
返回与键 key 关联的映射值的数量 |
empty( ) |
测试 map 是否为空 |
erase( m.begin() ) |
从 m.begin() 移除映射的单个元素 |
find( key ) |
查找与键 key 关联的元素如果找到就返回key的迭代器,找不到返回 end() |
insert( key:value ) |
通过在映射中插入新元素来扩展容器 |
size( ) |
返回映射中存在的元素数 |
插入
- 构造时插入 pari 类型
pair<string, int> student ("zhangsan", 17);
student.insert (student1);
student.insert (make_pair<string, int>("lisi", 18));
- 构造时插入 数组 类型
// 初始化数组插入(可以用二维一次插入多个元素,也可以用一维插入一个元素)
student.insert ({{"zhangsan", 17}, {"lisi", 18}});
- 数组形式插入
//数组形式插入
myrecipe["coffee"] = 10.0;
- 插入指定位置
m.insert(m.begin(), pair<char, int>('a', 1));
m2.insert(m1.begin(), m1.end());
查找 key
map<string, int>::iterator get = student.find ("zhangsan");
if ( get == student.end() )
cout << "not found";
else
cout << "found "<<get->first << " is " << get->second<<"\n\n";
修改 value
student.at("zhangsan") = 18;
student["zhangsan"] = 17;
删除元素
// 1. 通过位置
student.erase(student.begin());
// 2. 通过key
student.erase("milk");
// 3. void erase (iterator first, iterator last);
auto it = m.begin();
++it, ++it;
m.erase(m.begin(), it);
清空元素
student.clear();
到了这里,关于C++ STL map的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!