未排版,仅备自查
#include <map>
#include <iostream>
//容量查询
// // 查询map是否为空
// bool empty();
// // 查询map中键值对的数量
// size_t size();
// // 查询map所能包含的最大键值对数量,和系统和应用库有关。
// // 此外,这并不意味着用户一定可以存这么多,很可能还没达到就已经开辟内存失败了
// size_t max_size();
// // 查询关键字为key的元素的个数,在map里结果非0即1
// size_t count( const Key& key ) const; //
//交换
// 就是两个map的内容互换
// void swap( map& other );
using namespace std;
//定义map <关键字, 值>
std::map<int, string> hash_map;
int main(){
//一、插入
//1.1.使用[ ]进行单个插入。重复的插入会顶替旧的值
hash_map[2015] = "Tom";
//1.2.使用insert插入(单插和多插)
//插入单个值
hash_map.insert(std::pair<int, string>(2016, "Tim"));
//返回插入位置以及是否插入成功
pair<std::map<int, string>::iterator, bool> ret;
ret = hash_map.insert(std::pair<int, string>(2016, "Lara"));
//ret.second为插入是否成功(bool). 若插入失败,则 ret.first->first, ret.first->second为存在的键-值对
if (ret.second == false) {
std::cout << "key already existed";
std::cout << "Key is: " << ret.first->first << endl;
std::cout << "Val is: " << ret.first->second << endl;
}
else{//若插入成功,则为新的键-值对
std::cout << "Insertion successful" << endl;
std::cout << ret.first->first << endl;
std::cout << ret.first->second << endl;
}
//指定位置插入
std::map<int, string>::iterator it = hash_map.begin();
hash_map.insert(it, std::pair<int, string>(2017, "Fas")); //效率更高
hash_map.insert(it, std::pair<int, string>(2018, "Als")); //效率非最高
//范围多值插入
std::map<int, string> anothermap;
anothermap.insert(hash_map.begin(), hash_map.find(2017));
// 列表形式插入
anothermap.insert({ { 2019, "Niko"}, {2020, "S1mple"}});
//二、通过key访问/修改元素
//Map中元素取值主要有at和[ ]两种操作,at会作下标检查,而[]不会。
map<int, string> ID_Name ={{2016, "Gas"}};
//ID_Name中没有关键字2016,使用[]取值会导致插入
//因此,下面语句不会报错,但打印结果为空
cout<<ID_Name[2016].c_str()<<endl;//不建议使用
//使用at会进行关键字检查,如果存在则返回value,否则抛出out_of _range异常
//ID_Name.at(2017);//抛出异常
ID_Name.at(2016) = "Ats";//修改值
cout << ID_Name.at(2016) << endl;
//三、通过key查找
//3.1 使用count查找
int key = 2020;
if(ID_Name.count(key)>0)//返回值0或1
{
cout << "Search Successfully!" << endl;
}
else
cout << "Search Failed!" << endl;
//3.2 通过迭代器和find查找
map<int,string>::iterator iter;
iter = ID_Name.find(key);
if(iter!=ID_Name.end())
{ //打印键和值
cout << iter->first <<endl;
cout << iter->second << endl;
}
else
cout << "Search Failed!" << endl;
//四、删除
//4.1 通过key的erase() 可以移除键和参数匹配的元素,然后返回所移除元素的个数,例如:
std::map<std::string, size_t> people {{ "Fred", 45}, {"Joan", 33},{"Jill", 22}};
std::string name{"Joan"};
if(people.erase(name))//返回1,删除成功
std::cout << name << " was removed." << std::endl;
else//返回0,不存在该元素,删除失败
std::cout << name << " was not found" << std::endl;
//4.2 通过迭代器的erase() 这种情况下,返回的迭代器指向被删除元素的下一个位置.参数不能是结束迭代器。
// 如果迭代器参数指向的是容器的最后一个元素,删删除后会返回结束迭代器。
std::map<std::string, size_t>::iterator iter_ = people.erase(people.begin());
if(iter_ == people.end())
std::cout << "The last element was removed."<< std::endl;
else
std::cout << "The element preceding " << iter->first << "was removed." << std::endl;
//删除两个迭代器之间的元素(前闭后开),返回的迭代器指向这段元素中最后一个被删除的元素
auto iter_2 = people.erase(begin(people), end(people));//Erase all
return 0;
}