* Add key_compare member to ordered_map
* Replace == with key_compare in ordered_map
* Expose the actual comparison function used by object_t
nlohmann::ordered_map uses a different comparison function than the one
provided via template parameter.
* Introduce a type trait to detect if object_t has a key_compare member.
* Rename object_comparator_t to default_object_comparator_t.
* Add object_comparator_t to be conditionally defined as
object_t::key_compare, if available, or default_object_comparator_t
otherwise.
* Update the documentation accordingly.
Co-authored-by: Niels Lohmann <niels.lohmann@gmail.com>
* Add type traits to check if a type is usable as object key
Add type trait to check:
* if a type is a specialization of a template.
* if a type is a json_pointer.
* if a type is a basic_json::{const_,}iterator.
* if two types are comparable using a given comparison functor.
* if a type is comparable to basic_json::object_t::key_type.
* if a type has a member type is_transparent.
* if a type is usable as object key.
* if a type has an erase() function accepting a given KeyType.
Co-authored-by: Niels Lohmann <niels.lohmann@gmail.com>
* Rework basic_json element access to accept more key types
Rework basic_json element access member functions and operators to
accept any type that meets the requirements defined by type trait
detail::is_usable_as_key_type.
Member functions and operators:
* at()
* operator[]
* value()
* erase()
* find()
* count()
* contains()
Update documentation to reflect these changes.
Add unit tests to excercise the new functions using std::string_view.
Co-authored-by: Niels Lohmann <niels.lohmann@gmail.com>
Co-authored-by: Niels Lohmann <niels.lohmann@gmail.com>
6.9 KiB
nlohmann::basic_json::erase
// (1)
iterator erase(iterator pos);
const_iterator erase(const_iterator pos);
// (2)
iterator erase(iterator first, iterator last);
const_iterator erase(const_iterator first, const_iterator last);
// (3)
size_type erase(const typename object_t::key_type& key);
// (4)
template<typename KeyType>
size_type erase(KeyType&& key);
// (5)
void erase(const size_type idx);
-
Removes an element from a JSON value specified by iterator
pos. The iteratorposmust be valid and dereferenceable. Thus, theend()iterator (which is valid, but is not dereferenceable) cannot be used as a value forpos.If called on a primitive type other than
#!json null, the resulting JSON value will be#!json null. -
Remove an element range specified by
[first; last)from a JSON value. The iteratorfirstdoes not need to be dereferenceable iffirst == last: erasing an empty range is a no-op.If called on a primitive type other than
#!json null, the resulting JSON value will be#!json null. -
Removes an element from a JSON object by key.
-
See 3. This overload is only available if
KeyTypeis comparable with#!cpp typename object_t::key_typeand#!cpp typename object_comparator_t::is_transparentdenotes a type. -
Removes an element from a JSON array by index.
Template parameters
KeyType- A type for an object key other than
json_pointerthat is comparable withstring_tusingobject_comparator_t. This can also be a string view (C++17).
Parameters
pos(in)- iterator to the element to remove
first(in)- iterator to the beginning of the range to remove
last(in)- iterator past the end of the range to remove
key(in)- object key of the elements to remove
idx(in)- array index of the element to remove
Return value
- Iterator following the last removed element. If the iterator
posrefers to the last element, theend()iterator is returned. - Iterator following the last removed element. If the iterator
lastrefers to the last element, theend()iterator is returned. - Number of elements removed. If
ObjectTypeis the defaultstd::maptype, the return value will always be0(keywas not found) or1(keywas found). - See 3.
- (none)
Exception safety
Strong exception safety: if an exception occurs, the original value stays intact.
Exceptions
- The function can throw the following exceptions:
- Throws
type_error.307if called on anullvalue; example:"cannot use erase() with null" - Throws
invalid_iterator.202if called on an iterator which does not belong to the current JSON value; example:"iterator does not fit current value" - Throws
invalid_iterator.205if called on a primitive type with invalid iterator (i.e., any iterator which is notbegin()); example:"iterator out of range"
- Throws
- The function can throw the following exceptions:
- Throws
type_error.307if called on anullvalue; example:"cannot use erase() with null" - Throws
invalid_iterator.203if called on iterators which does not belong to the current JSON value; example:"iterators do not fit current value" - Throws
invalid_iterator.204if called on a primitive type with invalid iterators (i.e., iffirst != begin()andlast != end()); example:"iterators out of range"
- Throws
- The function can throw the following exceptions:
- Throws
type_error.307when called on a type other than JSON object; example:"cannot use erase() with null"
- Throws
- See 3.
- The function can throw the following exceptions:
- Throws
type_error.307when called on a type other than JSON object; example:"cannot use erase() with null" - Throws
out_of_range.401whenidx >= size(); example:"array index 17 is out of range"
- Throws
Complexity
- The complexity depends on the type:
- objects: amortized constant
- arrays: linear in distance between
posand the end of the container - strings and binary: linear in the length of the member - other types: constant - The complexity depends on the type:
- objects:
log(size()) + std::distance(first, last)- arrays: linear in the distance betweenfirstandlast, plus linear in the distance betweenlastand end of the container - strings and binary: linear in the length of the member - other types: constant log(size()) + count(key)log(size()) + count(key)- Linear in distance between
idxand the end of the container.
Notes
- Invalidates iterators and references at or after the point of the
erase, including theend()iterator. - (none)
- References and iterators to the erased elements are invalidated. Other references and iterators are not affected.
- See 3.
- (none)
Examples
??? example "Example: (1) remove element given an iterator"
The example shows the effect of `erase()` for different JSON types using an iterator.
```cpp
--8<-- "examples/erase__IteratorType.cpp"
```
Output:
```json
--8<-- "examples/erase__IteratorType.output"
```
??? example "Example: (2) remove elements given an iterator range"
The example shows the effect of `erase()` for different JSON types using an iterator range.
```cpp
--8<-- "examples/erase__IteratorType_IteratorType.cpp"
```
Output:
```json
--8<-- "examples/erase__IteratorType_IteratorType.output"
```
??? example "Example: (3) remove element from a JSON object given a key"
The example shows the effect of `erase()` for different JSON types using an object key.
```cpp
--8<-- "examples/erase__key_type.cpp"
```
Output:
```json
--8<-- "examples/erase__key_type.output"
```
??? example "Example: (5) remove element from a JSON array given an index"
The example shows the effect of `erase()` using an array index.
```cpp
--8<-- "examples/erase__size_type.cpp"
```
Output:
```json
--8<-- "examples/erase__size_type.output"
```
Version history
- Added in version 1.0.0. Added support for binary types in version 3.8.0.
- Added in version 1.0.0. Added support for binary types in version 3.8.0.
- Added in version 1.0.0.
- Added in version 3.11.0.
- Added in version 1.0.0.