草庐IT

unordered_container

全部标签

c++ - set vs unordered_set 最快迭代

在我的应用程序中,我有以下要求-数据结构将只用一些值(不是键/值对)填充一次。这些值可能会重复,但我希望数据结构只存储一次。我将遍历上面创建的数据结构的所有元素100次。元素在迭代中出现的顺序无关紧要。约束1表明我必须使用set或unordered_set,因为数据不是键值对的形式。现在集合插入比unordered_set插入成本更高,但数据结构仅在我的程序开始时填充一次。我相信决定因素将是我能够以多快的速度迭代数据结构的所有元素。为此,我不确定set或unordered_set是否会更快。我相信标准没有提到这个事实,因为对于任何一种数据结构,这个操作都是O(n)。但我想知道哪个数据结

c++ - 在 unordered_map 中选择随机元素

我这样定义一个unordered_map:std::unordered_mapedges;有没有一种从unordered_map边中选择随机边的有效方法? 最佳答案 C++11之前的解决方案:std::tr1::unordered_mapedges;std::tr1::unordered_map::iteratorrandom_it=edges.begin();std::advance(random_it,rand_between(0,edges.size()));C++11以后的解决方案:std::unordered_mapedg

c++ - 以 std::pair 作为键创建 std::unordered_map

我正在尝试创建一个以std::pair作为键的std::unordered_map。你可以想象,这需要我显式地提供一个类来为给定的键生成哈希,以及键的相等比较器。到目前为止,这是我的代码:#include#include#includetemplatestructPairHash{size_toperator()(conststd::pair&key){returnstd::hash()(key.first)^std::hash()(key.second);}};templatestructPairEqual{booloperator()(conststd::pair&lhs,cons

c++ - std::unordered_map::insert 的重载

你能教我为什么两者兼而有之std::unordered_map::insert(constvalue_type&)和templatestd::unordered_map::insert(P&&)存在于标准中?我认为insert(P&&)可以作为insert(constvalue_type&)。 最佳答案 这两个重载autostd::unordered_map::insert(constvalue_type&)->...templateautostd::unordered_map::insert(P&&)->...各有优势,谁也不能完

c++ - 为什么使用 string_view 而不是广义的 container_view<T>?

我发现新C++17标准中的string_view有点多余。我们为passingdatatocallee收集了一系列非常详细的简单机制。,没有太多开销,现在还有一个也只针对一种容器类型。我不明白为什么只为字符串提供这种机制,而不是为其他容器提供更通用的类型。一个明智的答案是我们已经有了这些解决方案。例如C++17andbeyond演示字符串View被解释为observer_ptr(orT*)forstring.请针对更通用的container_view陈述论点,与C++17引入的string_view形成对比。 最佳答案 广义cont

C++ STL Containers 无一异常(exception)都无法使用,我们能做些什么呢?

假定的C++精神是“所用,付费”。但是,由于异常及其在STL中的广泛使用,这可能会让人非常沮丧。在任何人说“打开异常”之前,我们必须生活的编程环境并不那么慷慨。我是内核编程,其中执行环境不提供足够的C++运行时来展开堆栈等。当STL容器无法为其底层后备存储重新分配存储空间时,它们将引发分配失败异常。当环境中未启用异常时,程序将相当神秘地崩溃:我已经看到实现直接中止,或者只是假设分配有效,即使它没有。我遇到的许多CADT库通过返回错误代码或将错误作为输出参数来预先处理此问题。处理这个问题的“最佳”C++方法是什么?澄清我不想使用标准库,我不能。我不是在问“我怎么做不能做的事”。我在问:“

c++ - map vs unordered_map 几个元素

我正在尝试在map和unordered_map之间进行选择以用于以下用例:map的键是一个指针。最常见的用例是map中只有一个元素。通常,map中的最大元素数小于10。map访问频率很高,速度是最重要的因素。很少更改map。虽然在这里测量速度显然是正确的方法,但此代码将在多个平台上使用,因此我试图创建一个通用的经验法则,用于在map和之间进行选择unordered_map基于元素的数量。我在这里看到一些帖子暗示std::map对于少量元素可能更快,但没有给出“小”的定义。是否有根据元素数量在map和unordered_map之间进行选择的经验法则?另一种数据结构(例如通过vector的

c++ - 带有 unordered_map 的模板代码膨胀

我想知道unordered_map使用类型删除实现,因为unordered_map和unordered_map可以使用完全相同的代码(除了强制转换,这是机器代码中的无操作)。也就是说,两者的实现都可以基于unordered_map。以节省代码大小。更新:这种技术通常被称为ThinTemplateIdiom(感谢下面的评论者指出这一点)。更新2:我对HowardHinnant特别感兴趣的意见。让我们希望他能读到这篇文章。所以我写了这个小测试:#include#ifBOOST#includeusingboost::unordered_map;#else#includeusingstd::u

c++ - propagate_on_container_move_assignment 的示例用法

我正在尝试了解如何正确书写AllocatorAware容器。我的理解是,propagate_on_container_move_assignmenttypedef表示Container本身被move-assign时是否需要复制某个Allocator类型。所以,由于我找不到这方面的任何示例,我自己的尝试将类似于以下内容:给定一个容器类型Container、一个Allocator类型allocator_type和一个内部allocator_type数据成员m_alloc:Container&operator=(Container&&other){if(std::allocator_trai

c++ - 无法使用 lambda 函数创建 unordered_set

我得到了错误error:calltoimplicitly-deleteddefaultconstructorof'__compressed_pair_elem':_Base1(std::forward(__t)),_Base2(){}使用以下代码。我犯了什么错误,我也无法理解错误。usingnamespacestd;automy_hash=[](vectorconst&vec){size_tseed=vec.size();for(auto&i:vec){seed^=i+0x9e3779b9+(seed>2);}returnseed;};usingMySet=unordered_set,