草庐IT

c++ - 将 STL 容器与包含其自身 key 的类一起使用

我有一个对象,可以通过它的名字来识别,我想把它放在在其中一个STL容器中。classMyClass{public://gettersandsetters,otherfunctionsprivate:std::stringname;//othermembervariables};所以起初我认为类map结构的使用与我的情况无关,因为在那些结构中,标识符(键)与类本身。使用映射,我必须返回名称变量并将其复制到类“外部”(浪费内存且不合逻辑,违反了OOP规则)。我的下一个目标是使用类似集合的结构。在这种情况下,我只有关键字段,我在其中加载整个对象。使用此方法,我必须重载我的和==运算符才能将对

C++总结(7):STL无序容器之unordered_set、unordered_map、unordered_multiset、unordered_multimap详解

前两节介绍了STL中的顺序容器和关联容器,本节来介绍一下无序容器。无序容器与关联容器类似,但是关联容器是顺序排序的,而无序容器实现了未排序(哈希)的数据结构。文章目录1unordered_set2unordered_map3unordered_multiset4unordered_multimap1unordered_set无序集合(unordered_set)是一种使用哈希表实现的无序关联容器,其中键被哈希到哈希表的索引位置,因此插入操作总是随机的。无序集合上的所有操作在平均情况下都具有常数时间复杂度O(1),但在最坏情况下,时间复杂度可以达到线性时间O(n),这取决于内部使用的哈希函数,但

c++ - 在 C++ 中初始化静态 std::map<int, unique_ptr<int>>

这是一个与此post类似的问题.我认为最有前途的答案与模板化静态初始化有关。这是该答案的类(class):templateclasscreate_map{private:std::mapm_map;public:create_map(constT&key,constU&val){m_map[key]=val;}create_map&operator()(constT&key,constU&val){m_map[key]=val;return*this;}operatorstd::map(){returnm_map;}};用法:std::mapmymap=create_map(1,2)(

c++ - 处理 map 键中指向值的常量

我有以下代码:#includeusingnamespacestd;structA{};mapdata;intget_attached_value(constA*p){returndata.at(p);}voidreset_all(){for(constauto&p:data)*p.first=A();}我的问题是,当我在data类型中注释和取消注释const时,此代码因类型错误而失败。有什么方法可以在不使用const_cast并且不丢失get_attached_value中的const的情况下解决这个问题? 最佳答案 问题似乎出在p

c++ - 如何避免重复使用 "indices trick"?

我有一个名为memory_region的类,有点像未类型化的gsl::span(即它本质上是一个void*和一个size_t),我也将其用于类型删除。因此它有一个as_span()方法。对于这个类,我有一个std::unordered_mapmy_map-它用于在我的不共享header的代码部分之间传递类型删除的跨度,因此它们无法了解彼此的类型。对其中之一的典型访问如下所示:autofoo=my_map.at("foo").as_span();这对于具有一组固定缓冲区、类型和名称的代码来说效果很好。但是-当我的代码缓冲区依赖于模板参数包时,事情就变得棘手了。现在,我实现了一个std::

c++ - 我如何知道 `rehash` 是否发生在我插入 unordered_map 之后?

我了解unordered_STL容器保留多个桶,桶的数量根据容器中元素的数量而变化。插入时,如果超过一定的限制,容器将重新散列以使用更多的桶,因此每个桶都不太满并且搜索速度更快。这会使迭代器无效。这意味着我不应该将迭代器保存到一个unordered容器中。除了我可以,如果我在重新哈希后更新它们。但是我找不到可靠的方法来检查insert(无论是emplace还是其他)是否导致了重新哈希。我应该监控bucket_count()吗?cppreference表示只有当新的元素数量大于max_load_factor()*bucket_count()时才会发生重新散列。那是有保证的吗?这样做靠谱吗

c++ - 避免使用 std::unordered_map(和其他)进行双重搜索或不必要的构造

我想在std::unordered_map上找到一个带有键的元素,或者如果它不存在则插入它。来自cppreference.com:std::unordered_map::emplaceInsertsanewelementintothecontainerconstructedin-placewiththegivenargsifthereisnoelementwiththekeyinthecontainer....Theelementmaybeconstructedeveniftherealreadyisanelementwiththekeyinthecontainer,inwhichca

c++ - 帮助在 std::map 中存储模板类的 intrusive_ptr

我在boost::intrusive_ptr中包含一个Locker类型的小模板类,我想将其存储在std::map中:templateboolLockerManager::AddData(conststd::string&id,T*pData){boost::intrusive_ptr>lPtr(Locker(pData));//Line359-compilesmMap.insert(make_pair(id,lPtr));//Line361-giveserror}Locker只是一个容器类;它的构造函数看起来像:templateLocker::Locker(T*pData):Intru

c++ - unordered_map 在 VS10 中抛出 bad_alloc 但在 VS9 中没有,这是一个错误吗?

同时writingapost关于projecteuler's14thproblem我遇到了VC9和VC10之间的行为差​​异。以下代码在VC9中运行正常,但在VC10中std::unordered_map抛出bad_alloc异常。奇怪的是,如果我从异常中恢复过来,future的分配将会成功(容器的大小继续增长)。另外,如果我使用boost::unordered_map,它在两个编译器中都能正常工作。关于实际内存使用情况,我在一台有4GBRAM的机器上运行(正在使用1.7),VC9版本在完成任务之前获得了大约810MB的内存,而VC10版本在大约658MB时崩溃了。这是VC10中的错误

c++ - std::map 按数据排序?

有没有办法按数据而不是键对std::map进行排序?现在我的代码将整个map复制到一个数组中只是为了做到这一点。 最佳答案 据我所知,std::map将为您提供迭代器,该迭代器将遍历按键排序的项目。要按值遍历已排序项目并仍然使用映射,唯一的方法是将整个集合重写为另一个映射,键和值颠倒。 关于c++-std::map按数据排序?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/399