STL——map
map
map 容器是关联容器的一种。在关联容器中,对象的位置取决于和它关联的键的值。键可以是基本类型,也可以是类类型。关键词起到索引的作用,值则是索引相关联的数据。map是以红黑树为底层机制完成的,插入删除等操作都在O(logn)时间内完成。
map
类模板定义在 map 文件头中,它定义了一个保存 T 类型对象的 map,每个 T 类型的对象都有一个关联的 K 类型的键。容器内对象的位置是通过比较键决定的。可以用适当的键值从 map 容器中检索对象。

为了可以在必要时生成默认的元素,容器保存的对象通常需要定义一个默认的构造函数。当两个对象的 secondname 不同时,成员函数 operator<() 通过比较 secondname 来确定对象的顺序。如果 secondname 相等,比较结果就由 firstname 决定。string 类定义了 operator<(),因而可以用默认的 less
来比较。 为了可以用这种对象作为 map 容器的键,必须为这个类定义 operator<()。
map的所有元素都是pair,不能拥有两个键值相同的元素。
map的创建:
map 类模板有 4 个类型参数,但一般只需要指定前两个模板参数的值。
template < class Key, // map::key_type 键
class T, // map::mapped_type 值
class Compare = less
, // map::key_compare 比较器 class Alloc = allocator
> // map::allocator_type 分配内存的分配器 > class map;
map的创建与初始化
map
students; map
students{{"csc”,20},{"qjt”,21}}; map
students{make_pair("csc”,20), make_pair("qjt",21)}; map
students {people}; // map people; map
students {people.begin(), people.end()}; map
students {begin(people), end(people)};
插入元素:
students["csc"] = 21; // []方式是通过重载[]操作符来实现的,它直接进行插入或覆盖。没有元素就插入,已有的元素就进行值的覆盖。如果没有赋值➕没有元素就创建并付给一个初值0。
students.insert(make_pair(“dmq",18));
students.emplace(make_pair(“zbj”,35)); //在适当的位置直接构造新元素,避免了移动与复制操作。(C++11)
auto it3 = students.emplace_hint(students.begin(), make_pair("csc",12)); // (C++11)
ps:emplace_hint()成员函数
template
iterator emplace_hint(const_iterator position, Args&&... args)
emplace_hint() 的返回值是指向新元素的迭代器;如果没有插入,返回的是和这个键匹配的现有元素的迭代器
必须为前者提供一个指示元素生成位置的迭代器,如果位置指向将跟随插入元素的元素(或者到最后,如果它是最后一个元素),则函数将优化其插入时间。注意,这并不强制新元素位于map容器中的那个位置(map中的元素总是遵循特定的顺序)。
ps2:insert()与emplace()对已有的元素不会进行覆盖,但有方法能在使用insert()或emplace()后进行值的覆盖。
insert()与emplace()会返回一个pair对象,pair 的成员变量 first 是一个指向插入元素或阻止插入的元素的迭代器;成员变量 second 是个布尔值,如果元素插入成功,second 就为 true。
#include
#include
#include
运行结果:

删除元素:
students.clear(); // 移除所有元素。
students.erase("csc"); // 删除键为”csc”的元素,返回删除元素的个数,map中返回0或1。
students.erase(students.begin()); // 删除当前迭代器位置的元素,返回被删除元素的下一个位置,删除最后一个元素的话返回的是结束迭代器。
auto it = students.erase(students.begin(),--students.end()); // 删除迭代器间的所有元素,返回最后一个被删除元素的下一个位置,删除最后一个元素的话返回的是结束迭代器。
if(people.erase("csc"))
cout << “remove success." << std::endl;
auto it = students.erase(students.begin());
cout << “last name is " << it->first << endl;
迭代器与遍历:(与其他容器相同)STL序列容器——vector
常用成员函数:
1.find() 返回指向查找的键的迭代器,没找到该元素的话返回结束迭代器 。
auto iter = students.find("qjt");if(iter != students.end())cout << "find name is " << iter->first << " ,age: " << iter->second << endl;elsecout << "not find name is qjt" << endl;
2.count() 返回指定元素出现的次数(map中只会返回0或1)
if(students.count("dmq")){auto iter1 = students.find("dmq");cout << "Map contains the name " << iter1->first << " ,age: " << iter1->second << endl;
}else{students.emplace(make_pair("dmq",17));
}
3.size() 返回map中的元素个数
4.empty() 如果map为空则返回true,反之false
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
