假设我有以下类(class):classMyOtherClass{std::unordered_map>_xy;voidputObject(intx,inty,MyClass*obj);voidcontainsXkey(intx){boolfound=false;std::unordered_map>::const_iteratorindex=_xy.find(x);if(index=_xy.end(){found=false;}else{found=true;}returnfound;}}假设我想编写一个函数将MyClass放置在坐标(2,3)处,那么我会这样做:voidputObj
我目前正在寻找std::map的更好替代方案,并且遇到了帖子标题中提到的类。有人可以阐明它们之间的区别,不是在性能/API方面,而是在它们与当前和future的通信标准相关的地方。 最佳答案 std::map:当前的C++标准关联容器(键/值),作为后面的树;std::unordered_map:下一个标准(C++0x——或在技术报告1中)散列映射容器,用作...散列映射。std::tr1::unordered_map:与前一个相同,但在tr1命名空间中,通常出现在希望提供TR1扩展但在不同于std的另一个命名空间中的编译器中。ex
如果我确定某个值还没有进入unordered_set,并且我要插入这样的值,传递这个集合end()是否正确>迭代器作为提示?编辑:代码:#includeusingnamespacestd;unordered_setsomeset;intmain(){autoit=someset.find(0);if(it==someset.end())someset.insert(it,0);//correct?possibleperformanceboostifthesetisactuallypopulated?} 最佳答案 我想,你可以简单地调
C++unordered_map的rehash()和reserve()方法有什么区别?为什么需要两种不同的方法? 最佳答案 区别在于目的,尽管两者都在做类似的事情。rehash获取现有映射并重建新大小的桶,在此过程中重新哈希并将元素重新分配到新桶中。reserve向您保证,如果您插入的元素数量不超过保留数量,则不会进行重新散列(即您的迭代器将保持有效)。尽管相关,但这是两个有些不同的事情。rehash不给你任何保证,reserve不表达重新散列的目的。如果您认为您的map效率低下,请使用rehash,如果您准备进行大量插入,请使用r
当在GCC4.9上移出一个unordered_set,然后重新使用移出的对象时,我在添加到它时得到除以零。我的理解(来自http://en.cppreference.com/w/cpp/utility/move)是可以使用移出的对象,前提是不违反其先决条件。在移出的集合上调用clear()很好(这在前提条件的上下文中是有意义的),但我不清楚我添加新元素是否违反了任何前提条件。示例代码:#includeusingnamespacestd;voidfoo(unordered_set&&a){unordered_setcopy=std::move(a);}voidtest(){unorder
std::unordered_map的典型布局是什么??是K和V对象本身存储在存储桶中,还是存储桶存储指向包含键和值的节点的指针?我正在尝试弄清楚使用std::unordered_map对性能的影响与std::unordered_map.假设我只放置和查找值,是否有任何理由更喜欢后者,即使值非常大?我能想到的唯一原因是,如果值以内联方式存储在桶中,并且每次重新散列容器时都需要重新分配。标准中有什么保证不会发生这种情况吗? 最佳答案 [unord.req]/8:Rehashinginvalidatesiterators,changes
我需要一个C++(STL)中的hash_map类。主要操作是将对放入集合中,然后检查它是否存在。我找不到示例代码来判断我声明的内容是否正确。#include#includeusingnamespacestd;usingnamespace__gnu_cxx;typedefpairpis;structeqpis{booloperator()(pisp1,pisp2)const{if(p1==p2)returntrue;returnfalse;}};intmain(){hash_map,eqpis>map;}这个编译。但是,如果我添加以下行:map[pis(10,"你好")]=10;然后它给
我正在尝试使用QString作为std::unordered_map中的键,但是我得到了错误:errorC2280:'std::hash::hash(conststd::hash&)':attemptingtoreferenceadeletedfunction我无法切换到QHash,因为映射的值类型是不可复制的。有什么方法可以使它起作用吗? 最佳答案 将hash实现放在header中,并确保在使用map的所有地方都包含该header。转发到qHash的简单实现应该就足够了:#include#include#includenamesp
大多数其他STL容器打印良好,但unordered_map是一个烂摊子。我使用operator用于打印,但这与打印无关,这是关于当我崩溃并且我想从LLDB提示符打印出我的哈希值时。我不能调用类似callcout的东西因为那行不通。除了例如,没有其他解决方案吗?链接本身使用cout的模板函数?那行得通吗?(我正在尝试,但它不起作用,因为我必须提前知道模板参数类型是什么,以便为它们生成和链接代码) 最佳答案 您应该能够检查unordered_map对象本身,而无需对其调用方法。例如,以这个简单的程序为例:#include#include
我正在使用std::unordered_map保存一些值,并且在添加新值时出现“vector下标超出范围”。我正在使用VisualStudio2012,错误跟踪是:std::vector>>>,std::_Wrap_alloc>>>>>>::operator[](unsignedint_Pos)Line1140C++std::_Hash,std::equal_to>,std::allocator>,0>>::_Vec_lo(unsignedint_Bucket)Line907C++std::_Hash,std::equal_to>,std::allocator>,0>>::_End(u