我有一个C++11程序,它执行一些计算并使用std::unordered_map来缓存这些计算的结果。该程序使用多个线程,它们使用共享的unordered_map来存储和共享计算结果。基于我对unordered_map和STL容器规范的阅读,以及unordered_mapthreadsafety,似乎一个unordered_map,被多个线程共享,一次可以处理一个线程写入,但是一次可以处理多个读取器。因此,我使用std::mutex来包装我对map的insert()调用,这样最多只有一个线程插入时间。但是,我的find()调用没有互斥锁,因为从我的阅读来看,似乎许多线程应该能够同时读取
我需要把一个map的内容(key是int的ID,value是自定义的struct)写入一个文件,稍后从文件中加载。我可以在带有CArchive的MFC中完成吗?谢谢! 最佳答案 在MFC中,我认为最简单的方法是首先序列化map的大小,然后简单地遍历所有元素。你没有指定你使用的是std::map还是MFC的CMap,但是基于std::map的版本可以看起来像这样:voidMyClass::Serialize(CArchive&archive){CObject::Serialize(archive);if(archive.IsStori
map::insert(iteratorposition,constvalue&k)的效率可以通过在参数位置提供适当的值来显着改善。如果我使用整数作为键,并且每次插入都使用比之前插入的所有键都大的数字完成,我可以加快::insert的速度吗?给出::end()时的操作map的迭代器?类似于:myMap.insert(myMap.end(),make_pair(next_number,myValue));哪里myMap类型为map和next_number是一个每次递增的大整数。编辑:这个问题的答案可能会有所不同,具体取决于数据是否存储在map中。密集与否(见下面的讨论)。所以,让我们从两
我有一个大的(大约->100K)集合,将用户标识符(一个整数)映射到他们购买的不同产品的数量(也是一个整数)。我需要尽可能高效地重新组织数据可以找出有多少用户拥有不同数量的产品。例如,有多少用户拥有1种产品,有多少用户拥有两种产品等。我通过将原始数据从std::map反转为std::multimap来实现这一点(其中键和值被简单地反转了。)我然后可以使用count(N)找出拥有N产品的用户数量(尽管我也将这些值唯一地存储在一个集合中,因此我可以确定确切的数量我正在迭代的值及其顺序)代码如下所示://ucisastd::mapcontainingtheoriginal//mappingo
我有一个项目在MSVS2010SP1下运行良好。我正在尝试将其转换为MSVS2012RC。我不得不更改一些内容,主要与C++header/lib路径和MFC自定义内容有关。但我还有最后一个障碍需要清除。在MSVC2010中,我使用了很多unordered_map,int>或map,int>。它编译得很好。但是在MSVS2012中,我只是得到这个错误:“C++标准不提供这种类型的散列”在网上搜索了一下,发现MSVS2012应该更接近C++11标准,标准只定义了基本类型的哈希函数和定义的4种字符串类型(其中string和wstring,但不包括basic_string)。所以我将所有bas
我遇到以下错误:classTest{std::maptest;};错误是“字段的类型不完整‘Test’”。我阅读了一些主题,建议这可能是xcode附带的libcxx版本中的错误,但如果我只需将其更改为:classTest{std::map>test;};我只是想仔细检查这绝对是一个正确的错误,而不是一个错误。干杯! 最佳答案 标准要求,除非另有说明,否则标准库模板组件中使用的所有类型都必须是完整的。因此libc++的错误是正确的。使用不完整类型是未定义的行为(§17.6.4.8[res.on.functions]/2),因此libs
如果std::unordered_map的两个键具有相同的哈希值,标准是否保证它们将进入同一个桶?根据模板相等谓词,我们假设键不相等,它们仅具有相同的哈希值。奖励问题:如果相同的散列并不意味着相同的桶,那么能够单独遍历桶的目的是什么? 最佳答案 具有相同哈希值的对象被无序关联容器放入同一个桶中。因此,两个相等的对象必须具有相同的哈希值。23.2.5第8段:Theelementsofanunorderedassociativecontainerareorganizedintobuckets.Keyswiththesamehashcod
假设我有以下代码:typedefstd::map::iteratorIterator;Iteratoriter=myMap.begin();while(iter!=myMap.end()){Iteratorcurrent=iter;++iter;maybeDeleteElement(current)//maycallerase.}鉴于std::map是作为红黑树实现的,能否保证映射中的每个元素都恰好被访问一次?还是修改map会导致树重新平衡,从而改变迭代顺序?注意:这不是关于任何迭代器是否会失效的问题。但是保持有效的迭代器并不一定意味着递增它会为您提供与之前相同的下一个元素。
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
我想使用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