草庐IT

map_coordinates

全部标签

c++ - 与 std::unordered_map 的数据竞争,尽管使用互斥锁定插入

我有一个C++11程序,它执行一些计算并使用std::unordered_map来缓存这些计算的结果。该程序使用多个线程,它们使用共享的unordered_map来存储和共享计算结果。基于我对unordered_map和STL容器规范的阅读,以及unordered_mapthreadsafety,似乎一个unordered_map,被多个线程共享,一次可以处理一个线程写入,但是一次可以处理多个读取器。因此,我使用std::mutex来包装我对map的insert()调用,这样最多只有一个线程插入时间。但是,我的find()调用没有互斥锁,因为从我的阅读来看,似乎许多线程应该能够同时读取

c++ - 具有相同散列值的值是否在同一个 std::unordered_map 桶中?

如果std::unordered_map的两个键具有相同的哈希值,标准是否保证它们将进入同一个桶?根据模板相等谓词,我们假设键不相等,它们仅具有相同的哈希值。奖励问题:如果相同的散列并不意味着相同的桶,那么能够单独遍历桶的目的是什么? 最佳答案 具有相同哈希值的对象被无序关联容器放入同一个桶中。因此,两个相等的对象必须具有相同的哈希值。23.2.5第8段:Theelementsofanunorderedassociativecontainerareorganizedintobuckets.Keyswiththesamehashcod

c++ - 从 std::map 插入/删除元素是否会修改迭代序列?

假设我有以下代码:typedefstd::map::iteratorIterator;Iteratoriter=myMap.begin();while(iter!=myMap.end()){Iteratorcurrent=iter;++iter;maybeDeleteElement(current)//maycallerase.}鉴于std::map是作为红黑树实现的,能否保证映射中的每个元素都恰好被访问一次?还是修改map会导致树重新平衡,从而改变迭代顺序?注意:这不是关于任何迭代器是否会失效的问题。但是保持有效的迭代器并不一定意味着递增它会为您提供与之前相同的下一个元素。

c++ - std::find 和 std::map.find 都是 O(logN) 吗?

std::find和std::map.find都是O(logN)吗?如果是,std::find如何在对数时间内实现对std::map的搜索?std::find的实现是否专门用于std::map用例? 最佳答案 不,std::find是O(N),与容器无关。它不知道“容器”,没有针对std::map的专门化。std::find仅使用迭代器,它没有关于底层容器的信息。根据cppreference.com,实现等同于:templateInputItfind(InputItfirst,InputItlast,constT&value){fo

c++ - 不完整类型 struct std::hash 与 unordered_map 的无效使用,其中 std::pair of enum class 作为键

我想使用unordered_map,std::uint8_t>用于管理一些像素图格式。这里是最少的代码:#include#include#include#include#includeenumclassPNM:std::uint8_t{PBM,PGM,PPM};enumclassFormat:bool{BIN,ASCII};structpair_hash{public:templatestd::size_toperator()(conststd::pair&x)const{returnstd::hash()(x.first)^std::hash()(x.second);}};intma

c++ - unordered_map 具有三个元素

我试图在unordered_map中包含三个元素。我试过下面的代码#include#include#include#includetypedefboost::unordered_map>mymap;mymapm;intmain(){//std::unordered_map>m;m.insert({3,std::make_pair(1,1)});m.insert({4,std::make_pair(5,1)});for(auto&x:m)std::cout但是我在打印语句中遇到了很多错误,比如‘std::pair’isnotderivedfrom‘conststd::__cxx11::b

c++ - 使用 C++ 模板实现 Haskell 的 `map` 函数的问题

我喜欢使用Haskell,但不得不使用C++来完成学校作业。我正在为C++编写自己的库,它模拟Haskell的Prelude函数,因此如果我愿意,我可以用C++编写更简洁、更实用的风格(repoonGitHub)。我遇到的一个问题是实现类似map的功能对列表进行操作。在Haskell中,String相当于[Char],因此您可以在采用列表的函数中使用字符串。在C++中,std::string不与std::vector是一回事,所以我必须编写多个版本的函数来取std::string或std::vector.这适用于像filter这样的功能或tail因为它们的输入和输出是同一类型。但是用m

c++ - 修改 std::map 的 key

有没有办法修改std::map或的键?Thisexample展示了如何通过重新平衡树来做到这一点。但是,如果我提供一些不需要重新平衡key的保证呢?#include#include#includeclassKeymap{private:intkey;//thiskeywillbeusedfortheindexinginttotal;public:Keymap(intkey):key(key),total(0){}booloperatormy_index;intmain(){std::mapmy_index;Keymapk(2);my_index.insert(std::make_pai

c++ - 为什么 std::map 有一个名为 count 的成员函数?

这个问题在这里已经有了答案:WhydoesSTLsethavecount()whenallelementsaresupposedtobeunique?(1个回答)关闭4年前。我正在学习C++,很明显,一种检查std::map中是否存在特定键的方法是使用成员函数count。但我的第一个想法是:键不应该是唯一的吗?并检查documentation实际上它们是唯一的,因此count将返回0或1。把它叫做count是不是有点违反直觉?为什么不存在?对我来说,在您期望元素出现多次的列表中计数是有意义的,但如果该方法只允许返回1或0,那对我来说就没有意义。我错过了什么吗?是否有理由将其称为coun

c++ - 如何使用 const 键复制 unordered_map?

简单代码:#includeintmain(){std::unordered_mapm;std::unordered_mapm1=m;}产生复杂的编译错误信息:ErrorC2280'std::hash::hash(void)':attemptingtoreferenceadeletedfunction在其内部基本上说unordered_map并不期望key是常量附言:我读过answer对于类似的问题:Theassociativecontainersonlyexposethe(key,value)pairasstd::pair,sotheadditionalconstonthekeytyp