问题标签 [stdmap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为什么我不能将引用存储在 C++ 中的`std::map` 中?
我知道引用不是指针,而是对象的别名。但是,我仍然不明白这对作为程序员的我到底意味着什么,即引擎盖下的引用是什么?
我认为理解这一点的最好方法是理解为什么我不能在地图中存储参考。
我知道我需要停止将引用视为语法糖而不是指针,只是不知道如何:/
c++ - 如果键不存在,为什么 std::map operator[] 会创建一个对象?
我很确定我已经在某个地方看到了这个问题(comp.lang.c++?谷歌似乎也没有在那里找到它)但是在这里快速搜索似乎没有找到它,所以它是:
如果键不存在,为什么 std::map operator[] 会创建一个对象?我不知道,但对我来说,如果你与大多数其他 operator[](如 std::vector)相比,这似乎违反直觉,如果你使用它,你必须确保索引存在。我想知道在 std::map 中实现这种行为的理由是什么。就像我说的那样,当使用无效键访问时,更像是向量中的索引和崩溃(我猜是未定义的行为)不是更直观吗?
看到答案后细化我的问题:
好的,到目前为止,我得到了很多答案,说它基本上很便宜,所以为什么不或类似的东西。我完全同意这一点,但为什么不为此使用专用函数(我认为其中一条评论说在 java 中没有 operator[] 并且该函数称为 put)?我的观点是为什么 map operator[] 不像矢量那样工作?如果我在向量的超出范围索引上使用 operator[],即使它很便宜,我也不希望它插入一个元素,因为这可能意味着我的代码中有错误。我的观点是为什么它与地图不一样。我的意思是,对我来说,在地图上使用 operator[] 意味着:我知道这个密钥已经存在(无论出于何种原因,我只是插入了它,我在某处有冗余,无论如何)。我认为这样会更直观。
那就是说使用 operator[] 执行当前行为有什么好处(仅为此,我同意应该存在具有当前行为的函数,而不是 operator[])?也许这样可以提供更清晰的代码?我不知道。
另一个答案是它已经以这种方式存在,所以为什么不保留它,但是,可能当他们(stl 之前的那些)选择以这种方式实现它时,他们发现它提供了优势或什么?所以我的问题基本上是:为什么选择以这种方式实现它,这意味着与其他 operator[] 有点缺乏一致性。它有什么好处?
谢谢
c++ - 使用 std:map 时崩溃
在我的 SDL 程序中,我使用映射构造来模拟某个类中的“无限”对象数组。代码设法编译得很好,但是当我运行程序时,一旦触发使用映射的函数之一,程序就会崩溃,返回值 3。
所以,这正是我正在做的事情:
当从 MyClass 对象调用 MyFunction() 时,会发生崩溃。每当使用 MyMap 完成任何使用时,它似乎都会发生:如果您注释掉倒数第二行并尝试返回 i,它会崩溃,如果您只是设置 i = 1,然后将对象分配给 MyMap[i],它会崩溃
这是我第一次使用地图,所以我不确定我是否正确使用它们。这是某个地方的基本错误吗?谁能指出我正确的方向?干杯。
c++ - 如何获取 std::map 的前 n 个元素
由于 C++ std::map 中没有 .resize() 成员函数,我想知道,如何获得最多包含 n 个元素的 std::map 。
显而易见的解决方案是创建一个从 0 到 n 的循环,并使用第 n 个迭代器作为 std::erase() 的第一个参数。
我想知道是否有任何不需要循环的解决方案(至少在我的用户代码中不需要)并且更像是“STL 方式”。
c++ - 如何设置以字符串为键、以 ostream 为值的映射?
我正在尝试通过map
以下方式在 C++ 中使用容器: Key 是 astring
并且 value 是 type 的对象ofstream
。我的代码如下所示:
但是,当我尝试编译上述代码时,出现以下错误:
出了什么问题?如果使用 无法做到这一点map
,是否有其他方法可以创建这样的键:值对?
注意:如果我用它测试我的代码,map<string, int> foo;
它工作正常。
c++ - 只读操作的 std::map 线程安全
我有一个 std::map 用于将值(字段 ID)映射到人类可读的字符串。当我的程序在任何其他线程启动之前启动时,这个映射被初始化一次,之后它就再也不会被修改了。现在,我给每个线程自己的这个(相当大的)映射副本,但这显然是对内存的低效使用,并且会减慢程序启动速度。所以我想给每个线程一个指向映射的指针,但这会引发线程安全问题。
如果我所做的只是使用以下代码从地图中读取:
这会起作用还是从多个线程读取 std::map 是否存在问题?
注意:我目前正在使用 Visual Studio 2008,但我希望它能够在大多数主要的 STL 实现中工作。
更新:为 const 正确性编辑了代码示例。
c# - 是否有任何通用的 HashTable 版本?
我需要一个像 C++ std::map 一样工作的类。更具体地说,我需要这样的行为:
map< string, vector<int> > my_map;
有可能吗?
c++ - std::map 的浅/深拷贝
我将如何最好地实施这些?我想到了这样的事情:
成员data
定义如下:
不幸的是,这不起作用。这是编译器错误,我不太了解它们:
不知何故,这对我来说看起来不必要地复杂。这是真的吗?我可以让它变得更好吗?
顺便说一句,我从 shape 派生的类中有 clone() 方法。也许我可以将它们用于 clone_deep 方法?他们还好吗?它们看起来像这样:
c++ - 如何初始化 std::map 一次,以便类的所有对象都可以使用它?
我有一个枚举 StackIndex 定义如下:
我创建了一个名为 的类MoveSequence
,它是一std::deque
组元组形式的包装器<StackIndex, StackIndex>
。
我想我可以创建一个类的静态std::map
成员MoveSequence
,它将 a 转换StackIndex
为 a std::string
,供Print()
函数使用。但是当我尝试时,我得到了错误:
如果无法将 std::map 创建为静态成员,是否有另一种方法可以创建将 a 转换为可用于打印出对象的 a 的 std StackIndex
:: std::string
map MoveSequence
?
谢谢
比带。
c++ - 是否不可能将 STL 映射与结构一起用作键?
我有以下代码:
当我尝试将 struct 的实例映射Node
到 时int
,出现编译错误。为什么?