* docs: new design for the documentation site Apply the brand to the Material for MkDocs site: Inter and JetBrains Mono served by the site (upright and real italic), brand colours, blue header band with the syntax pattern, wordmark in the header, new home page (hero, cards, animated feature tour), 404 page, polish for tabs, search, footer, focus rings, tables and code blocks, and theme features (code copy, previous/next footer, TOC follow, search suggestions). Draw the number railroad diagram, the parser callback events and the iterator illustrations as inline SVGs that follow the light and dark scheme. The generator scripts are in docs/mkdocs/scripts/figures; the feature slideshow (json-light.svg, json-dark.svg, replacing json.gif on the home page) is built by docs/mkdocs/scripts/slideshow. Decision nodes in five flowcharts become hexagons, which need far less room. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: add figures, table captions and a macro chooser - Figures with numbered captions: SAX stepper, json_view layout and edit stepper, exception map, JSON pointer and patch walkers, QA pipeline, scaling and binary size charts, roadmap lanes, release timeline, integration decision tree and namespace builder - Table captions (nj-table-caption) on 9 pages - Compile times: modules and PCH charts, filesystem section, re-measured Figure 1, links between features/modules.md and compile_times.md - Interactive macro chooser for features/arbitrary_types.md - Link check: exclude URLs that answer the plugin with 400/401/419 or are dead (customers.md) Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: macro chooser generates adl_serializer for non-default-constructible types Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: cross-link concept pages and API pages in See also sections Add See also links in both directions between the concept pages (features, home, integration) and the API pages, write API links in code font, give every entry a comment after a dash, and show the callback event figure on the parser callbacks page. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: address review comments on the new design - Home: add a "Latest release" button - Sponsors: update the list and group it by tier - Features: list all feature pages on the index page - Releases: add highlights per release, link the 4.0 roadmap, add the first commit to the timeline - Exceptions: prefix all example messages with the exception name - API: no code font for format names in the See also links of the to_/from_ pages - Merge Patch: show the document before, the patch, and the result - Replace "--" with typographic dashes, mark external links with an icon, center Mermaid diagrams Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
203 lines
7.8 KiB
Markdown
203 lines
7.8 KiB
Markdown
# <small>nlohmann::basic_json::</small>insert
|
|
|
|
```cpp
|
|
// (1)
|
|
iterator insert(const_iterator pos, const basic_json& val);
|
|
iterator insert(const_iterator pos, basic_json&& val);
|
|
|
|
// (2)
|
|
iterator insert(const_iterator pos, size_type cnt, const basic_json& val);
|
|
|
|
// (3)
|
|
iterator insert(const_iterator pos, const_iterator first, const_iterator last);
|
|
|
|
// (4)
|
|
iterator insert(const_iterator pos, initializer_list_t ilist);
|
|
|
|
// (5)
|
|
void insert(const_iterator first, const_iterator last);
|
|
```
|
|
|
|
1. Inserts element `val` into an array before iterator `pos`.
|
|
2. Inserts `cnt` copies of `val` into an array before iterator `pos`.
|
|
3. Inserts elements from range `[first, last)` into an array before iterator `pos`.
|
|
4. Inserts elements from initializer list `ilist` into an array before iterator `pos`.
|
|
5. Inserts elements from range `[first, last)` into an object.
|
|
|
|
## Iterator invalidation
|
|
|
|
For all cases where an element is added to an **array**, a reallocation can happen, in which case all iterators
|
|
(including the [`end()`](end.md) iterator) and all references to the elements are invalidated. Otherwise, only the
|
|
[`end()`](end.md) iterator is invalidated. Also, any iterator or reference after the insertion point will point to the
|
|
same index, which is now a different value.
|
|
|
|
For [`ordered_json`](../ordered_json.md), also adding an element to an **object** can yield a reallocation which again
|
|
invalidates all iterators and all references. Also, any iterator or reference after the insertion point will point to
|
|
the same index, which is now a different value.
|
|
|
|
## Parameters
|
|
|
|
`pos` (in)
|
|
: iterator before which the content will be inserted; may be the `end()` iterator
|
|
|
|
`val` (in)
|
|
: value to insert
|
|
|
|
`cnt` (in)
|
|
: number of copies of `val` to insert
|
|
|
|
`first` (in)
|
|
: the start of the range of elements to insert
|
|
|
|
`last` (in)
|
|
: the end of the range of elements to insert
|
|
|
|
`ilist` (in)
|
|
: initializer list to insert the values from
|
|
|
|
## Return value
|
|
|
|
1. iterator pointing to the inserted `val`.
|
|
2. iterator pointing to the first element inserted, or `pos` if `#!cpp cnt==0`
|
|
3. iterator pointing to the first element inserted, or `pos` if `#!cpp first==last`
|
|
4. iterator pointing to the first element inserted, or `pos` if `ilist` is empty
|
|
5. (none)
|
|
|
|
## Exception safety
|
|
|
|
Strong exception safety: if an exception occurs, the original value stays intact.
|
|
|
|
## Exceptions
|
|
|
|
1. The function can throw the following exceptions:
|
|
- Throws [`type_error.309`](../../home/exceptions.md#jsonexceptiontype_error309) if called on JSON values other than
|
|
arrays; example: `"cannot use insert() with string"`
|
|
- Throws [`invalid_iterator.202`](../../home/exceptions.md#jsonexceptioninvalid_iterator202) if called on an
|
|
iterator which does not belong to the current JSON value; example: `"iterator does not fit current value"`
|
|
2. The function can throw the following exceptions:
|
|
- Throws [`type_error.309`](../../home/exceptions.md#jsonexceptiontype_error309) if called on JSON values other than
|
|
arrays; example: `"cannot use insert() with string"`
|
|
- Throws [`invalid_iterator.202`](../../home/exceptions.md#jsonexceptioninvalid_iterator202) if called on an
|
|
iterator which does not belong to the current JSON value; example: `"iterator does not fit current value"`
|
|
3. The function can throw the following exceptions:
|
|
- Throws [`type_error.309`](../../home/exceptions.md#jsonexceptiontype_error309) if called on JSON values other than
|
|
arrays; example: `"cannot use insert() with string"`
|
|
- Throws [`invalid_iterator.202`](../../home/exceptions.md#jsonexceptioninvalid_iterator202) if called on an
|
|
iterator which does not belong to the current JSON value; example: `"iterator does not fit current value"`
|
|
- Throws [`invalid_iterator.210`](../../home/exceptions.md#jsonexceptioninvalid_iterator210) if `first` and `last`
|
|
do not belong to the same JSON value; example: `"iterators do not fit"`
|
|
- Throws [`invalid_iterator.211`](../../home/exceptions.md#jsonexceptioninvalid_iterator211) if `first` or `last`
|
|
are iterators into container for which insert is called; example: `"passed iterators may not belong to container"`
|
|
- Throws [`invalid_iterator.202`](../../home/exceptions.md#jsonexceptioninvalid_iterator202) if `first` or `last`
|
|
do not point to an array; example: `"iterators first and last must point to arrays"`
|
|
4. The function can throw the following exceptions:
|
|
- Throws [`type_error.309`](../../home/exceptions.md#jsonexceptiontype_error309) if called on JSON values other than
|
|
arrays; example: `"cannot use insert() with string"`
|
|
- Throws [`invalid_iterator.202`](../../home/exceptions.md#jsonexceptioninvalid_iterator202) if called on an
|
|
iterator which does not belong to the current JSON value; example: `"iterator does not fit current value"`
|
|
5. The function can throw the following exceptions:
|
|
- Throws [`type_error.309`](../../home/exceptions.md#jsonexceptiontype_error309) if called on JSON values other than
|
|
objects; example: `"cannot use insert() with string"`
|
|
- Throws [`invalid_iterator.202`](../../home/exceptions.md#jsonexceptioninvalid_iterator202) if `first` or `last`
|
|
do not point to an object; example: `"iterators first and last must point to objects"`
|
|
- Throws [`invalid_iterator.210`](../../home/exceptions.md#jsonexceptioninvalid_iterator210) if `first` and `last`
|
|
do not belong to the same JSON value; example: `"iterators do not fit"`
|
|
|
|
## Complexity
|
|
|
|
1. Constant plus linear in the distance between `pos` and end of the container.
|
|
2. Linear in `cnt` plus linear in the distance between `pos` and end of the container.
|
|
3. Linear in `#!cpp std::distance(first, last)` plus linear in the distance between `pos` and end of the container.
|
|
4. Linear in `ilist.size()` plus linear in the distance between `pos` and end of the container.
|
|
5. `O(N*log(size() + N))`, where `N` is the number of elements to insert.
|
|
|
|
## Examples
|
|
|
|
??? example "Example: (1) insert element into array"
|
|
|
|
The example shows how `insert()` is used.
|
|
|
|
```cpp
|
|
--8<-- "examples/insert.cpp"
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
--8<-- "examples/insert.output"
|
|
```
|
|
|
|
??? example "Example: (2) insert copies of element into array"
|
|
|
|
The example shows how `insert()` is used.
|
|
|
|
```cpp
|
|
--8<-- "examples/insert__count.cpp"
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
--8<-- "examples/insert__count.output"
|
|
```
|
|
|
|
??? example "Example: (3) insert a range of elements into an array"
|
|
|
|
The example shows how `insert()` is used.
|
|
|
|
```cpp
|
|
--8<-- "examples/insert__range.cpp"
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
--8<-- "examples/insert__range.output"
|
|
```
|
|
|
|
??? example "Example: (4) insert elements from an initializer list into an array"
|
|
|
|
The example shows how `insert()` is used.
|
|
|
|
```cpp
|
|
--8<-- "examples/insert__ilist.cpp"
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
--8<-- "examples/insert__ilist.output"
|
|
```
|
|
|
|
??? example "Example: (5) insert a range of elements into an object"
|
|
|
|
The example shows how `insert()` is used.
|
|
|
|
```cpp
|
|
--8<-- "examples/insert__range_object.cpp"
|
|
```
|
|
|
|
Output:
|
|
|
|
```json
|
|
--8<-- "examples/insert__range_object.output"
|
|
```
|
|
|
|
## See also
|
|
|
|
- [`emplace`](emplace.md) - add a value to an object
|
|
- [`emplace_back`](emplace_back.md) - add a value to an array
|
|
- [`push_back`](push_back.md) - add a value to an array/object
|
|
- [`update`](update.md) - merges objects
|
|
- [Modifying values](../../features/modifying_values.md) - the article on modifying values
|
|
|
|
## Version history
|
|
|
|
1. Added in version 1.0.0.
|
|
2. Added in version 1.0.0.
|
|
3. Added in version 1.0.0.
|
|
4. Added in version 1.0.0. Fixed in version 3.13.0 to copy the values before inserting; before, an `ilist` that
|
|
referred to elements of the array being inserted into could insert wrong values, because the range insert could
|
|
move from or shift an element before it was copied.
|
|
5. Added in version 3.0.0.
|