我想知道在哪种情况下我应该使用unordered_map而不是std::map。每次我不注意map中元素的顺序时,我都必须使用unorderd_map? 最佳答案 map通常使用red-blacktree实现.元素已排序。内存使用量相对较小(哈希表不需要额外的内存)。相对快速的查找:O(logN)。unordered_map通常使用hash-table实现.元素未排序。需要额外的内存来保存哈希表。快速查找O(1),但恒定时间取决于hash-function这可能相对较慢。另请记住,您可以与Birthdayproblem会面。.
对于std::map和std::tr1::unordered_map,我从标准中看到:Referencestoelementsintheunordered_mapcontainerremainvalidinallcases,evenafterarehash.他们是如何做到的(实现方面)?他们是否将所有条目维护为一种链表,然后哈希表只存储指向元素的指针? 最佳答案 是的,涉及到链表,但与您建议的方式不完全一样。2011年标准说(23.2.5第8段),“无序关联容器的元素被组织成桶。具有相同哈希码的键出现在同一个桶中。”在每个桶中,元素
对于std::map和std::tr1::unordered_map,我从标准中看到:Referencestoelementsintheunordered_mapcontainerremainvalidinallcases,evenafterarehash.他们是如何做到的(实现方面)?他们是否将所有条目维护为一种链表,然后哈希表只存储指向元素的指针? 最佳答案 是的,涉及到链表,但与您建议的方式不完全一样。2011年标准说(23.2.5第8段),“无序关联容器的元素被组织成桶。具有相同哈希码的键出现在同一个桶中。”在每个桶中,元素
如果我想在容器的开头也推送元素,我应该使用双端队列而不是vector吗?什么时候应该使用list,它有什么意义? 最佳答案 如果您需要在序列的开头和结尾进行有效的插入/删除以及随机访问,请使用deque;如果您需要在任何地方有效插入,请使用list,但会牺牲随机访问。list元素的迭代器和引用几乎在容器的任何突变下都非常稳定,而deque具有非常奇特的迭代器和引用失效规则(因此请仔细检查)。另外,list是基于节点的容器,而deque使用连续内存块,因此内存局部性可能具有渐近复杂度无法捕获的性能影响估计。deque几乎可以在任何
如果我想在容器的开头也推送元素,我应该使用双端队列而不是vector吗?什么时候应该使用list,它有什么意义? 最佳答案 如果您需要在序列的开头和结尾进行有效的插入/删除以及随机访问,请使用deque;如果您需要在任何地方有效插入,请使用list,但会牺牲随机访问。list元素的迭代器和引用几乎在容器的任何突变下都非常稳定,而deque具有非常奇特的迭代器和引用失效规则(因此请仔细检查)。另外,list是基于节点的容器,而deque使用连续内存块,因此内存局部性可能具有渐近复杂度无法捕获的性能影响估计。deque几乎可以在任何
背景:我来自Java世界,对C++或Qt还很陌生。为了玩unordered_map,我写了以下简单的程序:#include#include#include#include#include#includeusingstd::string;usingstd::cout;usingstd::endl;typedefstd::vectorfloatVector;intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);floatVectorc(10);floatVectorb(10);for(inti=0;imap;map[b]=135
背景:我来自Java世界,对C++或Qt还很陌生。为了玩unordered_map,我写了以下简单的程序:#include#include#include#include#include#includeusingstd::string;usingstd::cout;usingstd::endl;typedefstd::vectorfloatVector;intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);floatVectorc(10);floatVectorb(10);for(inti=0;imap;map[b]=135
使用begin()、end()和前向迭代器迭代unordered_map似乎很奇怪。如果是这样,为什么它也没有rbegin()、rend()和双向迭代器?有什么技术原因吗? 最佳答案 它是无序的,所以迭代发生的顺序是(或应该是)不重要的。 关于c++-为什么unordered_map没有rbegin()和rend(),而只有begin()和end(),我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q
使用begin()、end()和前向迭代器迭代unordered_map似乎很奇怪。如果是这样,为什么它也没有rbegin()、rend()和双向迭代器?有什么技术原因吗? 最佳答案 它是无序的,所以迭代发生的顺序是(或应该是)不重要的。 关于c++-为什么unordered_map没有rbegin()和rend(),而只有begin()和end(),我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q
这对你们中的一些人来说可能看起来很无聊,但是以下两种对STL容器进行迭代的方法中哪一种更好?为什么?classElem;typedefvectorElemVec;ElemVecelemVec;//Method0for(ElemVec::iteratori=elemVec.begin();i!=elemVec.end();++i){Elem&e=*i;//Dosomething}//Method1for(inti=0;i方法0看起来像更简洁的STL,但方法1用更少的代码实现了相同的效果。对容器的简单迭代是all出现在任何源代码中的位置。所以,我倾向于选择方法1,它似乎可以减少视觉困惑和代