草庐IT

Map-side

全部标签

c++ - 在 map 中就地构建不可 move 的对象

我正在尝试在包含原子的映射中构造一个对象,因此它既不能复制也不能moveAFAICT。我的C++读物reference是mapemplace应该能够做到这一点。但是由于删除或不存在的构造函数,以下代码无法编译。使用make_pair没有帮助。#include#includeclassZ{std::atomici;};std::unordered_mapmap;voidtest(void){map.emplace(0,Z());//errormap[0]=Z();//error}这可能吗,如果不可能,为什么不呢?编辑:Linux上的编译器是gcc4.8.1 最

c++ - 何时为键值数据选择 std::vector 而不是 std::map?

考虑到在主内存中搜索时缓存和数据局部性的积极影响,我倾向于使用std::vector与std::pair-喜欢键值项并对两者执行线性搜索,如果我知道键值项的总量永远不会“太大”而不会严重影响性能。最近我遇到了很多情况,我事先知道我将有大量键值项,因此选择了std::map从头开始。我想知道在上述情况下,您是如何决定使用合适的容器的。你会吗总是使用std::vector(或类似)?总是使用std::map(或类似)?对项目计数范围内的哪一个比另一个更可取有直觉吗?完全不同的东西?谢谢! 最佳答案 我很少将std::vector与线性搜

红黑树,以及其在C++的set、map等数据结构中应用

红黑树介绍:红黑树(Red-BlackTree)是一种自平衡的二叉搜索树,它在插入和删除操作后通过一系列的旋转和着色操作来维持平衡。红黑树的命名来自于节点上的额外颜色属性,每个节点要么是红色,要么是黑色。红黑树的特性:1.每个节点要么是红色,要么是黑色。2.树的根节点是黑色的。3.所有叶子节点(NIL节点,空节点)都是黑色的。4.如果一个节点是红色的,则其子节点必须是黑色的。5.从根节点到叶子节点的每条路径上,黑色节点的数量相同。这些特性保证了红黑树的关键性质:任意节点到其子孙节点的最长简单路径不超过其他路径的两倍,从而确保了红黑树的平衡性。在C++的标准库中,`std::set`和`std:

c++ - If-else-if 与 map

假设我有这样一个if/else-if链:if(x.GetId()==1){}elseif(x.GetId()==2){}//...50moreelseifstatements我想知道的是,如果我保留一张map,它在性能方面会不会更好?(假设键是整数) 最佳答案 map(通常)是使用红黑树实现的,它提供O(logN)查找,因为树始终保持平衡。您的if语句线性列表将是O(N)最坏的情况。所以,是的,map的查找速度会快得多。许多人建议使用switch语句,这对您来说可能不会更快,具体取决于您的实际if语句。编译器有时可以通过使用O(1)

c++ - std::map 中的元素是否保证有序?

这只是实现的副作用(红黑树)还是顺序由c++标准保证? 最佳答案 有序迭代不是实现细节;它由C++标准保证。它是所有关联容器的基本属性(C++03§23.1.2/9):Thefundamentalpropertyofiteratorsofassociativecontainersisthattheyiteratethroughthecontainersinthenon-descendingorderofkeyswherenon-descendingisdefinedbythecomparisonthatwasusedtoconstr

c++ - 使用 QString 作为 std::unordered_map 中的键

我正在尝试使用QString作为std::unordered_map中的键,但是我得到了错误:errorC2280:'std::hash::hash(conststd::hash&)':attemptingtoreferenceadeletedfunction我无法切换到QHash,因为映射的值类型是不可复制的。有什么方法可以使它起作用吗? 最佳答案 将hash实现放在header中,并确保在使用map的所有地方都包含该header。转发到qHash的简单实现应该就足够了:#include#include#includenamesp

c++ - 为什么 insert from std::map 不想更新? [C++]

我试图多次将同一个键插入到map中,但具有不同的值。它不起作用。我知道operator[]可以完成这项工作,但我的问题是,这种插入行为是否正确?insert()不应该插入吗?我想知道标准是怎么说的。不幸的是我没有它(C++标准)所以我无法检查。感谢您提供有用的答案。 最佳答案 如果要插入具有不同值的相同键,则需要std::multimap。如果键已经存在,std::map::insert将不会执行任何操作。std::map::operator[]将覆盖旧值。对于STL引用,您不需要C++标准本身;类似http://www.cplus

c++ - map 在运行时选择 `std::greater` 或 `std::less`

这一行:std::map>current_book;我想用以下逻辑等价物替换它:intSide=...if(Side==1){std::map>current_book;}else{std::map>current_book;} 最佳答案 您可以为此使用std::function:usingmymap=std::map>;autom=Side?mymap(std::less()):mymap(std::greater());liveexample 关于c++-map在运行时选择`std:

C++ 是否在恒定时间内执行 std::set、std::map 等的 begin/end/rbegin/rend?

对于std::set和std::map等以对数时间查找的数据类型,实现是否需要维护开始和结束迭代器?访问begin和end是否意味着查找可能以对数时间发生?我一直假设开始和结束总是在常数时间内发生,但是我在Josuttis中找不到任何对此的证实。既然我正在做一些我需要对性能有所了解的事情,我想确保涵盖我的基础。谢谢 最佳答案 它们发生在常数时间内。我正在查看ISO/IEC14882:2003标准的第466页:表65-容器要求a.开始();(恒定的复杂性)a.end();(恒定的复杂性)表66-可逆容器要求a.rbegin();(恒定

c++ - STL map<char*,char*> 析构函数

我知道映射析构函数调用每个包含元素的析构函数。会发生什么map?我看不到这段代码在/usr/include/c++/4.4中的什么地方编辑:我应该说map喜欢http://www.sgi.com/tech/stl/Map.html 最佳答案 当map被摧毁,它包含的所有元素也被摧毁。如果元素是类类型,则调用每个元素的析构函数。但是,请牢记上面map中包含的内容。正如您所料,它不是字符串——它只是指向字符串的指针。琴弦本身并没有被破坏。只有指针是。delete永远不会在指针上调用。恰当的例子:mapstrings;char*key=n