////
Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
Copyright (c) 2025 Dmitry Arkhipov (grisumbras@yandex.ru)

Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

Official repository: https://github.com/boostorg/json
////

[#dom_object]
= `object` &lt;<ref_value>&gt; 使用 &lt;<ref_object>&gt; 的实例作为 JSON 对象的底层表示。&lt;<ref_object>&gt; 类型的实例是一种关联容器，存储键值对，其中键为 &lt;<ref_string_view>&gt;，映射的值类型为 &lt;<ref_value>&gt;。此类容器以标准映射（map）为模型，具有以下特性：</ref_value></ref_string_view></ref_object></ref_object></ref_value>

* 元素以 &lt;<ref_key_value_pair>&gt; 的实例形式连续存储。</ref_key_value_pair>

* 迭代器是普通指针，在插入或删除操作时可能会失效。
（删除）

* 只要不发生删除操作，插入顺序即被保留。

* 所有插入的值将使用与容器本身相同的 {ref_memory_resource}。
（容器本身）

可以使用&lt;<default_memory_resource,default memory="" resource="">&gt;来构造一个空对象，而无需进行任何内存分配。也可以显式指定一个&lt;<ref_storage_ptr>&gt;：</ref_storage_ptr></default_memory_resource,default>

[source]
----
include::../../../test/snippets.cpp[tag=snippet_objects_1,indent=0]
----

由两元素键值对组成的初始化列表可用于构造带有初始内容的对象。这些构造函数可能会分配内存并抛出异常：

[source]
----
include::../../../test/snippets.cpp[tag=snippet_objects_2,indent=0]
----

或或者，也可以在构造之后插入元素：

[source]
----
include::../../../test/snippets.cpp[tag=snippet_objects_3,indent=0]
----

与 `std` 对应容器类似，可通过 &lt;<ref_object_at>&gt; 使用边界检查直接按键访问元素，或通过 &lt;<ref_object_operator_lb_rb>&gt; 进行无边界检查访问（若键不存在则创建空元素）：</ref_object_operator_lb_rb></ref_object_at>

[source]
----
include::../../../test/snippets.cpp[tag=snippet_objects_4,indent=0]
----

在内部，该容器会对键值进行哈希处理，从而使得查找操作的复杂度平均保持在恒定时间内。

[WARNING]
====
Unlike traditional node based containers like `std::set`, there is no
guarantee of reference stability or iterator stability on insertions
and erasures.

For example:

[source]
----
include::../../../test/snippets.cpp[tag=snippet_objects_5,indent=0]
----

Using `arr` after adding another value to `obj` results in undefined behavior.
====

要查看所有可用成员函数和嵌套类型的完整列表，请参阅 &lt;<ref_object>&gt; 的参考页面。</ref_object>

与 `std::pair` 类似，&lt;<ref_key_value_pair>&gt; 类型可用于 {cpp}17 的结构化绑定。为此专门提供了 `std::tuple_size`、`std::tuple_element` 的特化及 &lt;<ref_get>&gt; 的重载。</ref_get></ref_key_value_pair>

== 格式化输出

当 &lt;<ref_object>&gt; 被格式化输出到 {std_ostream} 时，结果将是有效的 JSON。即根据 JSON 规范，对象将以花括号和逗号分隔的键/值对列表形式输出。</ref_object>
