草庐IT

c++ - 散列指针作为 C++ STL 中 unordered_map 的键

我发布了一个类似的quetion关于在C++STL中使用指针作为map上的键。当用作键时,指针如何在unordered_maps中散列。更具体地说,如果我定义:std::unordered_mapfoo;默认的C++std::hash实现是否可以处理这些指针?使用安全吗?这是好的做法吗? 最佳答案 std::hash已定义,但其操作方式的细节取决于实现。使用它肯定是安全的,我认为这是一个很好的做法-只要它是您需要作为键的指针,而不是对象内容本身。 关于c++-散列指针作为C++STL中u

c++ - 如何获取 std::unordered_map 的最后一个元素?

如何获取std::unordered_map的最后一个元素?myMap.rbegin()和--myMap.end()是不可能的。 最佳答案 容器中没有无序的“最后一个元素”。您可能需要一个有序的容器,例如std::map并使用mymap.rbegin()->first访问最后一个元素(另见thispost)编辑:要检查您的迭代器是否会到达末尾,只需递增它(并可能将其保存在临时文件中)并根据mymap.end()检查它,或者,甚至更干净:if(std::next(it)==last) 关于

c++ - 是否可以从 map 中的键初始化 vector ?

Howtoretrieveallkeys(orvalues)fromastd::mapandputthemintoavector?涵盖了从C++11之前的映射中的键填充std::vector的方法。有没有一种方法可以在C++11中使用lambda等来做到这一点,这意味着我们可以在一行中完成,这样我们就可以从映射中初始化vector,而不是创建一个vector并在2个Action中填充它?例如vectorv(???(m.begin(),m.end()));纯C++11是首选,但boost是可以接受的...目的是在一行中完成此操作,而不会过于复杂和“炫耀”,因此不会让其他开发人员感到困惑。

c++ - std::map 可以在调用 const 函数期间重新平衡吗?

我有一个conststd::map>成员变量和函数conststd::vector*foo().我希望此函数有时返回指向此map元素的指针。但我担心map可能会重新平衡-即使在std::map期间也是如此标记为const的功能-使我返回的指针无效。我知道对map的任何后续修改都会使我的指针无效,但由于我已将成员变量标记为const,所以这种情况不会发生。.我有时无法返回引用,foo需要返回nullptr.我所做的安全吗? 最佳答案 标准很明确:唯一可以无效的映射的迭代器或指针或引用正在删除它指向的元素。您甚至可以插入其他元素不会使您

c++ - 如何将已排序的 std::list of std::pair 转换为 std::map

我有一个std::list>,我知道这是根据std::stringelement排序的.因为我想做很多std::find_if基于std::string元素,我相信一个std::map与lower_bound和upper_bound会更合适。事实是我想insertstd::map中的元素以一种有效的方式。所以我想使用一个额外的迭代器来制作insert更快。我相信最简单的方法是使用const_reverse_iterator通过std::list并使用begin()的std::map.你会这样做吗,还是一个坏主意?谢谢! 最佳答案 如

c++ - 我可以在 map 不执行任何旋转的情况下预加载 STL map 吗?

我已经对来自数据库的数据进行了排序以初始化STLmap。只有5%的数据稍后会在map内部更改。据我了解,每次插入都会产生轮换开销。是否可以绕过排序数据的开销?例如有没有跳过旋转的选项,还有另一个STL算法来创建一个具有排序数据的平衡树?PS:我知道最多只有2个旋转,但想知道我是否可以进一步提高性能。 最佳答案 我假设您只对高效加载初始排序数据感兴趣?标准map::map(InputIteratorfirst,InputIteratorlast)constructor似乎在做正确的事。“对于迭代器构造函数,如果元素已经根据comp排序

c++ - 如何合并 2 个 std::maps,并在第 3 个映射中输出结果

编辑原始问题,因为我想问有关std::map的问题,而不是std::vector。我的错。对不起。我的数据实际上在2个std::map中。我想将这两张map合并成第三张map。我的第一张和第二张map包含具有相同键的条目。所以我也想将这些键下的数据合并到我生成的第三张map中。因此,如果我使用std::merge,我是否会丢失第一个或第二个映射公共(public)条目中的数据?正如我所提到的,两个map中都有共同的数据(值)? 最佳答案 顺序容器的信息如果vector(或其他顺序容器,如list或deque)已排序,则可以使用std

c++ - std::forward_iterator_tag 的作用是什么?

在分析一个应用程序时,我碰到了gcc4.7.1附带的那部分标准库实现。它是include/g++-v4/bits/vector.tcc:templatetemplatevoidvector::_M_range_insert(iterator__position,_ForwardIterator__first,_ForwardIterator__last,std::forward_iterator_tag){…}我注意到函数签名的最后一个参数只是一个标记,我开始想知道它为什么会在这里。快速浏览thispage表明std::forward_iterator_tag是一个空结构。它在这里的作

java - 作为 Java 开发人员理解 C++ 中的 Map

这个问题在这里已经有了答案:CanweuseauserdefinedclassforthekeyinaSTLmap?(6个答案)关闭8年前。在Java中,我们有像hashCode()和equals()这样的方法,map使用它们来识别每个对象。C++没有这样的基本方法,每个对象默认实现。map现在如何使用自定义对象作为键值?编辑:没有重复,因为它特别针对那些特定于Java的接口(interface)方法,以前没有用过C++的人会寻找

golang map

golang的map使用的是hashmap基本结构下面截取自源码,已翻译//runtime/map.go:117//gomap定义,hashmap缩写typehmapstruct{ countint//map里文件数 flagsuint8//map当前是否在写入,一般为hashWriting=4(写入中)或0(空闲) Buint8//桶的数量,2^B个 noverflowuint16//溢出桶的数量 hash0uint32//hash随机数,从hmap创建开始就不变 bucketsunsafe.Pointer//存储桶的指针,存放2^B个桶的地址 oldbucketsunsafe.Pointe