C++11标准中,序列容器包含很多:
vector,list,array,deque
在c++中,头文件有
#include <map>
#include <hash_map>
两种。这阆中map其实差不多,都提供了key-value的查询,但是本质上又差了很多;
先说区别:
- 构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数).
- 存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。
那么什么时候需要用hash_map,什么时候需要用map?
总体来说,hash_map 查找速度会比map快,而且查找速度基本和数据数据量大小,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且hash_map的构造速度较慢。
现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。
——参考文章
1.MAP
第一
2.Set
被java中set的方便震惊后,发现C++也有;
性质:相同元素只能添加一次;
头文件:
#include <set>
用法和vector等C++容器类型非常像;
count() 划重点 ,用来查找set中某个某个键值出现的次数。
,因为一个键值在set只可能出现0或1次
,这样就变成了判断某一键值是否在set出现过了。
begin() ,返回set容器的第一个元素
end() ,返回set容器的最后一个元素
clear() ,删除set容器中的所有的元素
empty() ,判断set容器是否为空
max_size() ,返回set容器可能包含的元素最大个数
size() ,返回当前set容器中的元素个数
rbegin ,返回的值和end()相同
rend() ,返回的值和rbegin()相同
例题:力扣217
Set解法:
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
set<int> data;
for(int i=0;i<nums.size();i++)
{
if(data.count(nums[i]))
return true;
data.insert(nums[i]);
}
return false;
}
};
排序解法:(不是本文重点,只是个解题思路)
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
sort(nums.begin(),nums.end());
if(nums.size()<2)
return false;
vector<int>::iterator iter = nums.begin();
while(iter!=nums.end()-1)
{
if((*iter)==*(iter+1))
return true;
iter++;
}
return false;
}
};