我在InterviewBit上解决了一个问题,并遇到了一个问题,
这是https://www.interviewbit.com/problems/diffk-ii/的链接。
当我使用c++ STL映射解决此问题时,它向我显示消息
超出内存限制。您的提交未在分配的内存限制内完成。
这是我的代码
int Solution::diffPossible(const vector<int> &A, int B) {
int n = A.size();
map< int , int > mp;
for(int i =0;i<n; i++)
mp[A[i]] = i;
int k = B;
for(int i =0; i<n; i++){
if(mp.find(A[i]+k) != mp.end() && mp[A[i]+k] != i){
return 1;
}
if(mp.find(A[i]-k) != mp.end() && mp[A[i]-k] != i){
return 1;
}
}
return 0;
}
当我将 map 替换为unorderd_map解决方案时。
这是代码
int Solution::diffPossible(const vector<int> &A, int B) {
int n = A.size();
unordered_map< int , int > mp;
for(int i =0;i<n; i++)
mp[A[i]] = i;
int k = B;
for(int i =0; i<n; i++){
if(mp.find(A[i]+k) != mp.end() && mp[A[i]+k] != i){
return 1;
}
if(mp.find(A[i]-k) != mp.end() && mp[A[i]-k] != i){
return 1;
}
}
return 0;
}
这意味着 map 比unordered_map占用更多的内存。
谁能解释这是怎么回事?为什么 map 占用更多内存
空间比unordered_map好吗?
最佳答案
请注意,2个
int
通常将占用8个字节,与单个指针相同。例如,查看GNU libstdc++实现。 RB树的节点定义如下:
struct _Rb_tree_node_base
{
typedef _Rb_tree_node_base* _Base_ptr;
typedef const _Rb_tree_node_base* _Const_Base_ptr;
_Rb_tree_color _M_color;
_Base_ptr _M_parent;
_Base_ptr _M_left;
_Base_ptr _M_right;
...
在那里,您可以观察到这三个指针。
通常,很难说哪个容器消耗的总内存更少。但是,我创建了一个基准测试,将1M随机数插入两个容器中,并测量了最大常驻大小(MaxRSS),以反射(reflect)所有消耗的内存空间,包括堆内部数据。结果如下:
std::map
,std::unordered_map
,std::unordered_map
和reserve
。 请注意,由于存储区列表的重新分配,无序映射(广告2)的内存消耗较高。这就是
reserve
成员函数的作用。如果一个人关心内存消耗并且事先知道元素的数量,那么他/她应该始终进行预分配(这与 vector 相同)。关于c++ - 就内存使用而言,C++中的map和unordered_map有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56438738/