c++ - 如果键不存在,为什么 std::map operator[] 会创建一个对象?

标签 c++ stdmap

我很确定我已经在某个地方看到过这个问题(comp.lang.c++?Google 似乎也没有在那里找到它),但是在这里快速搜索似乎没有找到它,所以在这里:

为什么 std::map operator[] 如果键不存在会创建一个对象?我不知道,但对我来说,如果你与大多数其他 operator[](如 std::vector)相比,这似乎违反直觉,如果你使用它,你必须确保索引存在。我想知道在 std::map 中实现这种行为的基本原理是什么。就像我说的那样,在使用无效键访问时更像是 vector 中的索引并崩溃(我猜是未定义的行为)不是更直观吗?

我得到了很多答案,基本上都说“它很便宜,为什么不呢?”或类似的。我完全同意这一点,但为什么不为此使用专用函数(我认为其中一条评论说在 Java 中没有 operator[] 并且该函数称为 put)?我的观点是为什么 map operator[] 不像 vector 那样工作?如果我在 vector 的超出范围索引上使用 operator[] 我不希望它插入一个元素 即使它很便宜 因为这可能意味着错误在我的代码中。我的观点是为什么它与 map 不一样。我的意思是,对我来说,在 map 上使用 operator[] 意味着:我知道这个 key 已经存在(无论出于何种原因,我只是插入了它,我在某处有冗余,无论如何)。我认为这样会更直观。

这就是说使用 operator[] 执行当前行为的优势是什么(仅出于此目的,我同意应该存在具有当前行为的函数,而不是 operator[]) ?也许这样可以提供更清晰的代码?我不知道。

另一个答案是它已经以这种方式存在,所以为什么不保留它,但可能当他们(STL 之前的那些)选择以这种方式实现它时,他们发现它提供了优势或什么?所以我的问题基本上是:为什么选择以这种方式实现它,这意味着与其他 operator[] 有点缺乏一致性。它有什么好处?

最佳答案

因为 operator[] 返回对值本身的引用,因此指示问题的唯一方法是抛出异常(通常,STL 很少抛出异常)。

如果您不喜欢这种行为,您可以使用 map::find 代替。它返回一个迭代器而不是值。这允许它在找不到值时返回一个特殊的迭代器(它返回 map::end),但还需要您取消对迭代器的引用以获取该值。

关于c++ - 如果键不存在,为什么 std::map operator[] 会创建一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1639544/

相关文章:

c++子线程在main()父线程退出时终止?

c++ - 寻找一个C++开源的矩阵存储库

c++ - 我的 friend 无法在他的 Linux 发行版上运行我的 openGL 程序

c++ - 初始化 map 被报告为空的奇怪行为

c++ - 如何在搜索中不使用 std::map 的自定义比较功能(map::find)?

c++ - std::map::erase(it++) 是否维护指向 map 中下一个元素的有效迭代器?

c++ - 在 C++ 中打开并写入现有的 fstream 而无需覆盖/清除

c++ - STL map Custom Key Class [默认构造函数]

c++ - 当其键不存在时初始化 std::map 值

带有结构的 C++ getline()