1. unordered_map
代码:
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
unordered_map<string, int> votes;
votes["小明"]++;
votes["李华"]++;
votes["小明"]++;
pair<string, int> vote1("小方", 4);
votes.insert(vote1);
votes.emplace("陈一", 7);
votes.insert(make_pair<string, int>("张三", 3));
unordered_map<string, int> vote2 = { {"李四", 4}, {"王五", 5}, {"赵六", 6} };
votes.insert(vote2.begin(), vote2.end());
votes["刘二"] = 9;
cout << "********************************遍历********************************" << endl;
cout << "遍历结果1:" << endl;
for (auto& vote : votes) {
cout << vote.first << ": " << vote.second << endl;
}
cout << "遍历结果2:" << endl;
for (auto iter = votes.begin(); iter != votes.end(); ++iter) {
cout << iter->first << ": " << iter->second << endl;
}
cout << endl;
cout << "********************************查找********************************" << endl;
unordered_map<string, int>::const_iterator vote3 = votes.find("王五");
if (vote3 == votes.end())
cout << "没找到" << endl;
else
cout << "找到 " << vote3->first << ": " << vote3->second << endl;
cout << endl;
cout << "********************************删除********************************" << endl;
votes.erase("张三");
votes.erase(votes.begin());
votes.erase(vote3);
cout << "删除后:" << endl;
for (auto& vote : votes) {
cout << vote.first << ": " << vote.second << endl;
}
cout << endl;
cout << "********************************修改********************************" << endl;
votes["刘二"] = 3;
votes.at("李四") = 6;
cout << "修改结果:" << endl;
for (auto& vote : votes) {
cout << vote.first << ": " << vote.second << endl;
}
cout << endl;
cout << "********************************清空********************************" << endl;
votes.clear();
bool isempty = votes.empty();
if (isempty)
cout << "已清空所有记录!" << endl;
}
输出:
********************************遍历********************************
遍历结果1:
小明: 2
李四: 4
小方: 4
李华: 1
陈一: 7
张三: 3
王五: 5
赵六: 6
刘二: 9
遍历结果2:
小明: 2
李四: 4
小方: 4
李华: 1
陈一: 7
张三: 3
王五: 5
赵六: 6
刘二: 9
********************************查找********************************
找到 王五: 5
********************************删除********************************
删除后:
李四: 4
小方: 4
李华: 1
陈一: 7
赵六: 6
刘二: 9
********************************修改********************************
修改结果:
李四: 6
小方: 4
李华: 1
陈一: 7
赵六: 6
刘二: 3
********************************清空********************************
已清空所有记录!
??从上面的插入和遍历结果可以看出,unordered_map的存储是无序的。不过,虽然存储结果无序,但是其元素之间的相对位置还是固定的,所以两次遍历的结果也是一模一样的。与unordered_map相比,map的存储结果是有序的。 ??
2. map
代码:
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
map<string, int> votes;
votes["小明"]++;
votes["李华"]++;
votes["小明"]++;
pair<string, int> vote1("小方", 4);
votes.insert(vote1);
votes.emplace("陈一", 7);
votes.insert(make_pair<string, int>("张三", 3));
map<string, int> vote2 = { {"李四", 4}, {"王五", 5}, {"赵六", 6} };
votes.insert(vote2.begin(), vote2.end());
votes["刘二"] = 9;
for (auto& vote : votes) {
cout << vote.first << ": " << vote.second << endl;
}
}
输出:
陈一: 7
李华: 1
李四: 4
刘二: 9
王五: 5
小方: 4
小明: 2
张三: 3
赵六: 6
??由于这里key是字符串,所以map根据字符串的字母顺序进行了升序排序。map的增删改查方法和unorder_map基本上一样,使用方法也一致。虽然它们很像,但是实现方法却不一样,且各有特点:
- unordered_map:基于哈希表,元素无序存储;增删改查的复杂度接近于O(1),查询速度快,但稳定性较差。
- map:基于红黑树,元素有序存储;增删改查的复杂度都为O(logn),查询速度慢,但稳定性高。
|