声明:本人所有测试代码环境都为vs2017
在 C++11 中,STL 提供了 4 个 unordered 系列的关联式容器,这四个容器底层结构都是哈希桶,所以查找效率都非常快(O(1))。分别是:unordered_map 、 unordered_set 、unordered_multimap 和 unordered_multiset
本文对该四种容器进行了一些简单的介绍,以及一些接口的使用。最后举例在适合的题目场景的使用方式
1. unordered_map
unordered_map是存储<key, value>键值对的关联式容器,但是key值不能重复。
应用代码:
void Testunordered_map()
{
unordered_map<string, string> m;
//1.插入
//通过pair结构体
m.insert(pair<string, string>("小明", "18岁"));
m.insert(pair<string, string>("小红", "19岁"));
m.insert(pair<string, string>("小花", "17岁"));
//通过标准库全局函数make_pair
m.insert(make_pair("小黑", "20岁"));
//不能重复插入
m.insert(make_pair("小明", "18岁"));//size的值不会改变
//2.map的元素个数
cout << "SIZE: " << m.size() << endl; //--4
//3.map中哈希桶的个数
cout << "buket number: " << m.bucket_count() << endl; //--8
//4.某号桶中的元素个数
cout << "0号桶元素元素个数: " << m.bucket_size(0) << endl;//--0
//5.某key对应的桶号
cout << "小黑 所在的桶号: " << m.bucket("小黑") << endl; //--6
//6.元素访问[]
//若key存在,直接返回key所对应的value值
cout << m["小花"] << endl; //--17岁
cout << "SIZE: "<< m.size() << endl; // --4
//若key不存在,<key,默认value>会构成一个键值对,并插入容器,结果会返回默认的value,一般为空字符串
cout << m["小牛"] << endl; //" "
cout << "SIZE: "<< m.size() << endl; //--5
//7.删除
m.erase("小牛");
cout << "SIZE: " << m.size() << endl; //--4
//8.清除
m.clear();
cout << "SIZE: " << m.size() << endl; //--0
}
2. unordered_multimap
unordered_multimap是存储<key, value>键值对的关联式容器,key值可以重复,但是没有[]元素访问。
应用代码:
void Testunordered_multimap()
{
unordered_multimap<string, string> m;
//重复插入元素
m.insert(pair<string, string>("小明", "18岁"));
cout << "SIZE: " << m.size() << endl; //---1
m.insert(make_pair("小明", "18岁"));
cout << "SIZE: " << m.size() << endl; //--2
}
3. unordered_set
unordered_set是存储元素key的关联式容器,key不能重复。
void Testunordered_set()
{
unordered_set<string> s;
//插入
s.insert("小明");
s.insert("小红");
s.insert("小花");
cout << s.size() << endl;
//迭代器
unordered_set<string>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
++it;
}
}
4. unordered_multiset
unordered_set是存储元素key的关联式容器,key可以重复。
void Testunordered_multiset()
{
unordered_multiset<string> s;
//插入
s.insert("小明");
s.insert("小红");
s.insert("小花");
cout << s.size() << endl;
//可以重复插入
s.insert("小明");
cout << s.size() << endl;
unordered_set<string>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
++it;
}
}
5. 解题应用
class Solution {
public:
int repeatedNTimes(vector<int>& A) {
unordered_map<int,int> m;
for(auto e:A)
{
m[e]++;
}
int N=A.size()/2;
for(auto e:m)
{
if(e.second==N)
{
return e.first;
}
}
return 0;
}
};
本文深入探讨了C++11中STL提供的四种unordered容器:unordered_map、unordered_set、unordered_multimap和unordered_multiset。文章详细介绍了这些容器的特性、使用方法及应用场景,包括如何插入、访问和删除元素,以及在实际问题中的应用示例。

2825

被折叠的 条评论
为什么被折叠?



