ordered_map.hpp #
Defines toml::ordered_map
, which is used to maintain the order of values in a file.
class ordered_map
#
namespace toml
{
template<typename Key, typename Val, typename Cmp = std::equal_to<Key>,
typename Allocator = std::allocator<std::pair<Key, Val>>>
class ordered_map;
}
The ordered_map
is a map
type that preserves the insertion order of values, allowing iteration in that order.
As a linear container, searches require O(n)
time relative to the number of elements.
Use this when search operations are infrequent and maintaining the order of values is important.
Non-Member Types #
namespace toml
{
struct ordered_type_config;
using ordered_value = basic_value<ordered_type_config>;
using ordered_table = typename ordered_value::table_type;
using ordered_array = typename ordered_value::array_type;
}
Use these in place of toml::type_config
and toml::value
.
Since
toml::parse
defaults to usingtype_config
, specifyconst auto input = toml::parse<toml::ordered_type_config>("input.toml");
when parsing.
Member Types #
using key_type = Key;
using mapped_type = Val;
using value_type = std::pair<Key, Val>;
using key_compare = Cmp;
using allocator_type = Allocator;
using container_type = std::vector<value_type, Allocator>;
using reference = typename container_type::reference;
using pointer = typename container_type::pointer;
using const_reference = typename container_type::const_reference;
using const_pointer = typename container_type::const_pointer;
using iterator = typename container_type::iterator;
using const_iterator = typename container_type::const_iterator;
using size_type = typename container_type::size_type;
using difference_type = typename container_type::difference_type;
Member Functions #
Constructors #
ordered_map() = default;
Constructs an empty ordered_map
.
Constructors (Comparator, Allocator) #
explicit ordered_map(const Cmp& cmp, const Allocator& alloc = Allocator());
explicit ordered_map(const Allocator& alloc);
Constructs an ordered_map
with a specified comparator for key comparison and an allocator for memory management.
Copy and Move Constructors #
ordered_map(const ordered_map&) = default;
ordered_map(ordered_map&&) = default;
ordered_map(const ordered_map& other, const Allocator& alloc);
ordered_map(ordered_map&& other, const Allocator& alloc);
Constructs an ordered_map
by copying or moving the contents from another ordered_map
.
An allocator can also be specified for memory management.
Constructors (Iterator) #
template<typename InputIterator>
ordered_map(InputIterator first, InputIterator last, const Cmp& cmp = Cmp(), const Allocator& alloc = Allocator());
template<typename InputIterator>
ordered_map(InputIterator first, InputIterator last, const Allocator& alloc = Allocator());
Constructs an ordered_map
with a range represented by iterators.
The order of the elements follows the order of the iterators.
Constructors (std::initializer_list) #
ordered_map(std::initializer_list<value_type> v, const Cmp& cmp = Cmp(), const Allocator& alloc = Allocator());
ordered_map(std::initializer_list<value_type> v, const Allocator& alloc);
Initializes the ordered_map
using an initializer list.
Copy and Move Assignment Operators #
ordered_map& operator=(const ordered_map&) = default;
ordered_map& operator=(ordered_map&&) = default;
Assigns the contents of another ordered_map
to this one, using copy or move semantics.
Assignment Operator (std::initializer_list) #
ordered_map& operator=(std::initializer_list<value_type> v);
Assigns the contents of an initializer list to the ordered_map
.
Destructor #
~ordered_map() = default;
Destroys the ordered_map
.
begin()
, end()
#
iterator begin() noexcept;
iterator end() noexcept;
const_iterator begin() const noexcept;
const_iterator end() const noexcept;
const_iterator cbegin() const noexcept;
const_iterator cend() const noexcept;
Returns iterators to the beginning and end of the container, allowing iteration over its contents in order.
empty()
#
bool empty() const noexcept;
Returns true
if the ordered_map
is empty, false
otherwise.
size()
#
std::size_t size() const noexcept;
Returns the number of elements in the ordered_map
.
max_size()
#
std::size_t max_size() const noexcept;
Returns the maximum number of elements the ordered_map
can hold.
clear()
#
void clear();
Clears all elements from the ordered_map
.
push_back(kv)
#
void push_back(const value_type&);
void push_back(value_type&&);
Appends a key-value pair to the end of the ordered_map
.
emplace_back(k, v)
#
void emplace_back(key_type, mapped_type);
Appends a key-value pair to the end of the ordered_map
by constructing it in place.
pop_back()
#
void pop_back();
Removes the last element from the ordered_map
.
insert(kv)
#
void insert(value_type);
Inserts a key-value pair at the end of the ordered_map
.
emplace(k, v)
#
void emplace(key_type, mapped_type);
Inserts a key-value pair at the end of the ordered_map
by constructing it in place.
count(k)
#
std::size_t count(const key_type&) const noexcept;
Returns the number of elements with the specified key.
Since duplicate keys are not allowed, this will return either 1
if the key exists or 0
if it does not.
contains(k)
#
bool contains(const key_type&) const noexcept;
Returns true
if the ordered_map
contains an element with the specified key, false
otherwise.
find(k)
#
iterator find(const key_type& key) noexcept;
const_iterator find(const key_type& key) const noexcept;
Finds an element with the specified key and returns an iterator to it. If the key is not found, returns end()
.
at(k)
#
mapped_type& at(const key_type& k);
mapped_type const& at(const key_type& k) const;
Finds an element with the specified key and returns a reference to its value. Throws std::out_of_range
if the key is not found.
operator[](k)
#
mapped_type& operator[](const key_type& k);
mapped_type const& operator[](const key_type& k) const;
Finds an element with the specified key and returns a reference to its value.
If the key is not found, a new value is constructed and returned.
If the ordered_map
is const
, throws std::out_of_range
instead.
key_comp()
#
key_compare key_comp() const;
Returns the comparator used for key comparison.
Notes #
Key Modification #
Since
ordered_map
usesstd::pair<Key, Val>
forvalue_type
, it is possible to modify the key through an iterator. However, this practice is not recommended.If you modify a key this way and it conflicts with an existing key, one of the conflicting keys will become unsearchable.
When using
operator[]
,push_back
, orinsert
, collisions with existing keys are detected.
Order Preservation Details #
ordered_map
maintains the order of keys, but this order preservation applies only to keys defined within the same table. Order across different tables is not maintained.For example, the order in the following file will be preserved:
apple.type = "fruit" apple.skin = "thin" apple.color = "red" orange.type = "fruit" orange.skin = "thick" orange.color = "orange"
In contrast, the order in the following file will not be preserved:
apple.type = "fruit" orange.type = "fruit" apple.skin = "thin" orange.skin = "thick" apple.color = "red" orange.color = "orange"
ordered_map
preserves the order of theapple
andorange
definitions at the root table level, and the order oftype
,skin
,color
within eachapple
andorange
table.