前两节介绍了STL中的顺序容器和关联容器,本节来介绍一下无序容器。无序容器与关联容器类似,但是关联容器是顺序排序的,而无序容器实现了未排序(哈希)的数据结构。文章目录1unordered_set2unordered_map3unordered_multiset4unordered_multimap1unordered_set无序集合(unordered_set)是一种使用哈希表实现的无序关联容器,其中键被哈希到哈希表的索引位置,因此插入操作总是随机的。无序集合上的所有操作在平均情况下都具有常数时间复杂度O(1),但在最坏情况下,时间复杂度可以达到线性时间O(n),这取决于内部使用的哈希函数,但
如果i是一个int,类似++i+++i的表达是未定义的行为,因为有2个未排序的修改i.但是,如果i是一些int-类,++i+++i相反具有不确定顺序的修改,因此是定义的行为(在这种情况下具有确定性结果)。是否存在这样一种情况,即对基元的操作是无序的而不是不确定的顺序会更好?如果是这样,为什么这种情况不适用于用户创建的类型?如果不是,为什么原始操作根本没有顺序? 最佳答案 一般来说,“未排序”的越多越好。在C++中不可能使两个函数交错运行。因此,不可能交错运行两个operator++实现。因此,对于实现operator++的类类型,这
可能这很容易,但我只想了解我们是否可以这样做:假设我们有一个unordered_map(string,string)所以默认情况下它会检查两个字符串是否相等。现在,假设我们在相等运算符中再添加一项功能,即使两个字符串彼此是变位词,也能返回true。为此,我们能否只更新相等运算符而不更新哈希器(并使用默认哈希器)。例如,只定义仿函数:booloperator()(conststring&a,conststring&b)const{//checkforanagramconditionhere} 最佳答案 相同的对象必须具有相同的哈希值,
在构造过程中使用插入(或放置)而不进行分配后,如何保留无序集合中元素的顺序?有关此问题的详细信息,这是一个示例:构造了一个无序的整数集S480插入到S中:S={480}32插入到S中:S={32480}23被插入到S中:S={2332480}16被插入到S中:S={162332480}19被插入到S中:S={19480322316}您可以看到最后一次插入是如何破坏序列顺序的(我假设通过重建一个更大的集合并将元素移动过来)。我正在寻找一种方法来在插入元素后保留先前的顺序,而无需在构造函数中专门分配。 最佳答案 根据定义,无序集是无序的
我有一个如下所示的无序集:[1,2,3,4,6,7,5]我想从我的无序集中删除并存储一个元素,我不关心删除了哪个元素。我目前正在做以下事情。有更快的方法吗?autoit=set_of_ints.begin();set_of_ints.erase(it);..........std::cout我打算在删除之前粘贴打印语句,但许多答案都讨论了这个问题。所以我将保持原样。 最佳答案 不,std::unordered_set::erase成员函数是唯一用于从集合中删除元素的函数,docs说:ComplexityGivenaninstance
我有一个C++任务,我必须设计一个简单的解决方案来解决我选择的容器的Knuth问题,并研究生成的性能数据。请参阅以下问题:Threemillionmenwithdistinctnameswerelaidend-to-end,reachingfromNewYorktoCalifornia.Eachparticipantwasgivenaslipofpaperonwhichhewrotedownhisownnameandthenameofthepersonimmediatelywestofhimintheline.Themanattheextremewesternendofthelined
我的意图是隐藏容器的实现细节,这样客户端就不能依赖隐式插入顺序。我试图通过以某种方式改变迭代发生的顺序来强制执行此操作。我有一个容器,我想在迭代时随机排序。这是一些伪代码。namespaceabc{templateclassRandomList{voidinsert(Tt);Terase(Tt);iteratorbegin();iteratorend();}}namespacetest{intmain(){RandomListlist;list.insert(1);list.insert(2);list.insert(3);for(typenameRandomList::iterato
在C++标准§23.2.7无序关联容器[unord.req]中表91描述了STL无序关联容器必须满足的附加要求。在此表中,标准规定STL无序容器(即unordered_set、unordered_map、unordered_multiset和unordered_multimap)必须作为成员类型提供local_iterator和const_local_iterator.local_iterator是一个迭代器类型,其类别、值、差异、指针和引用类型与无序容器的iterator相同。此迭代器可用于迭代单个存储桶但不能跨存储桶。const_local_iterator是一个迭代器类型,其类别
在c++11中,std::unordered_set容器提供插入重载和新函数emplace,因此它可以与不可复制构造的键一起使用,例如std::unique_ptr。当您想删除其中一个key时会发生什么?autotemp=std::move(*some_iterator)有效吗?是否有一些函数可以让我们同时删除一个元素并将其move到临时文件中?编辑:我试着让它简短、甜美和简单,但要更清楚:是否有迭代器适配器(可能是move_iterator?)可以让我从容器中move元素并删除该迭代器?如果不是,为什么不呢?future的c++不应该包含这种接口(interface)吗?情况似乎
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭7年前。Improvethisquestion由于语言标准很少规定实现方法,我想知道C++标准库实现(libc++、libstdc++和dinkumware)使用的真实世界哈希方法是什么。如果不清楚,我希望答案是这样的方法:散列与链接除法/乘法散列通用哈希完美散列(静态、动态)使用开放寻址进行散列(线性/二次探测或双重散列)罗宾汉哈希法布隆过滤器布谷鸟哈希知道为什么选择一种特定方法而不是其他方法也是一件好事。