/Src/Dependencies/Boost/libs/bimap/doc/reference/set_of.qbk
http://hadesmem.googlecode.com/ · text · 935 lines · 650 code · 285 blank · 0 comment · 0 complexity · e5b5a244dd6aea9f62da4c52143d0f77 MD5 · raw file
- [/license
- Boost.Bimap
- Copyright (c) 2006-2007 Matias Capeletto
- 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)
- ]
- [/ QuickBook Document version 1.4 ]
- [section set_of Reference]
- [section Header "boost/bimap/set_of.hpp" synopsis]
- namespace boost {
- namespace bimaps {
- template
- <
- class KeyType,
- class KeyCompare = std::less< KeyType >
- >
- struct set_of;
- template
- <
- class KeyCompare = std::less< _relation >
- >
- struct set_of_relation;
- } // namespace bimap
- } // namespace boost
- [endsect]
- [section Header "boost/bimap/multiset_of.hpp" synopsis]
- namespace boost {
- namespace bimaps {
- template
- <
- class KeyType,
- class KeyCompare = std::less< KeyType >
- >
- struct multiset_of;
- template
- <
- class KeyCompare = std::less< _relation >
- >
- struct multiset_of_relation;
- } // namespace bimap
- } // namespace boost
- [endsect]
- [section Collection type specifiers set_of and multiset_of]
- These collection type specifiers allow for insertion of sets disallowing or
- allowing duplicate elements, respectively. The syntaxes of `set_of` and
- `multiset_of` coincide, so they are described together.
- [endsect]
- [section \[multi\]set_of Views]
- A \[multi\]set_of set view is a std::\[multi\]set signature-compatible
- interface to the underlying heap of elements contained in a `bimap`.
- There are two variants: set_of, which does not allow duplicate elements
- (with respect to its associated comparison predicate) and multiset_of,
- which does accept those duplicates. The interface of these two variants
- is largely the same, so they are documented together with their
- differences explicitly noted where they exist.
- If you look the bimap from a side, you will use a map view, and if you
- look at it as a whole, you will be using a set view.
- namespace boost {
- namespace bimaps {
- namespace views {
- template< ``['-implementation defined parameter list-]`` >
- class ``['-implementation defined view name-]``
- {
- public:
- typedef ``['-unspecified-]`` key_type;
- typedef ``['-unspecified-]`` value_type;
- typedef ``['-unspecified-]`` key_compare;
- typedef ``['-unspecified-]`` value_compare;
- typedef ``['-unspecified-]`` allocator_type;
- typedef ``['-unspecified-]`` reference;
- typedef ``['-unspecified-]`` const_reference;
- typedef ``['-unspecified-]`` iterator;
- typedef ``['-unspecified-]`` const_iterator;
- typedef ``['-unspecified-]`` size_type;
- typedef ``['-unspecified-]`` difference_type;
- typedef ``['-unspecified-]`` pointer;
- typedef ``['-unspecified-]`` const_pointer;
- typedef ``['-unspecified-]`` reverse_iterator;
- typedef ``['-unspecified-]`` const_reverse_iterator;
- typedef ``['-unspecified-]`` info_type;
- this_type & operator=(const this_type & x);
- allocator_type get_allocator() const;
- // iterators
- iterator begin();
- const_iterator begin() const;
- iterator end();
- const_iterator end() const;
- reverse_iterator rbegin();
- const_reverse_iterator rbegin() const;
- reverse_iterator rend();
- const_reverse_iterator rend() const;
- // capacity
- bool empty() const;
- size_type size() const;
- size_type max_size() const;
- // modifiers
- std::pair<iterator,bool> ``[link reference_set_of_insert_value insert]``(const value_type & x);
- iterator ``[link reference_set_of_insert_iterator_value insert]``(iterator position, const value_type & x);
- template< class InputIterator>
- void ``[link reference_set_of_insert_iterator_iterator insert]``(InputIterator first, InputIterator last);
- iterator ``[link reference_set_of_erase_iterator erase]``(iterator position);
- template< class CompatibleKey >
- size_type ``[link reference_set_of_erase_key erase]``(const CompatibleKey & x);
- iterator ``[link reference_set_of_erase_iterator_iterator erase]``(iterator first, iterator last);
- bool ``[link reference_set_of_replace_iterator_value replace]``(iterator position, const value_type& x);
- // Only in map views
- // {
- template< class CompatibleKey >
- bool ``[link reference_set_of_replace_key_iterator_key replace_key]``(iterator position, const CompatibleKey & x);
- template< class CompatibleData >
- bool ``[link reference_set_of_replace_data_iterator_data replace_data]``(iterator position, const CompatibleData & x);
- template< class KeyModifier >
- bool ``[link reference_set_of_modify_key_iterator_modifier modify_key]``(iterator position, KeyModifier mod);
- template< class DataModifier >
- bool ``[link reference_set_of_modify_data_iterator_modifier modify_data]``(iterator position, DataModifier mod);
- // }
- void swap(this_type & x);
- void clear();
- // observers
- key_compare key_comp() const;
- value_compare value_comp() const;
- // set operations
- template< class CompatibleKey >
- iterator ``[link reference_set_of_find_key find]``(const CompatibleKey & x);
- template< class CompatibleKey >
- const_iterator ``[link reference_set_of_find_key find]``(const CompatibleKey & x) const;
- template< class CompatibleKey >
- size_type ``[link reference_set_of_count_key count]``(const CompatibleKey & x) const;
- template< class CompatibleKey >
- iterator ``[link reference_set_of_lower_bound_key lower_bound]``(const CompatibleKey & x);
- template< class CompatibleKey >
- const_iterator ``[link reference_set_of_lower_bound_key lower_bound]``(const CompatibleKey & x) const;
- template< class CompatibleKey >
- iterator ``[link reference_set_of_upper_bound_key upper_bound]``(const CompatibleKey & x);
- template< class CompatibleKey >
- const_iterator ``[link reference_set_of_upper_bound_key upper_bound]``(const CompatibleKey & x) const;
- template< class CompatibleKey >
- std::pair<iterator,iterator>
- ``[link reference_set_of_equal_range_key equal_range]``(const CompatibleKey & x);
- template< class CompatibleKey >
- std::pair<const_iterator,const_iterator>
- ``[link reference_set_of_equal_range_key equal_range]``(const CompatibleKey & x) const;
- // Only in maps views
- // {
- template< class LowerBounder, class UpperBounder>
- std::pair<iterator,iterator> ``[link reference_set_of_range_lower_upper range]``(
- LowerBounder lower, UpperBounder upper);
- template< class LowerBounder, class UpperBounder>
- std::pair<const_iterator,const_iterator> ``[link reference_set_of_range_lower_upper range]``(
- LowerBounder lower, UpperBounder upper) const;
- typedef ``['-unspecified-]`` data_type;
- // Only in for `set_of` collection type
- // {
- template< class CompatibleKey >
- const data_type & ``[link reference_set_of_at_key_const at]``(const CompatibleKey & k) const;
- // Only if the other collection type is mutable
- // {
- template< class CompatibleKey >
- data_type & ``[link reference_set_of_operator_bracket_key operator\[\]]``(const CompatibleKey & k);
- template< class CompatibleKey >
- data_type & ``[link reference_set_of_at_key at]``(const CompatibleKey & k);
- // }
- // Only if info_hook is used
- // {
- template< class CompatibleKey >
- info_type & ``[link reference_set_of_info_at_key info_at]``(const CompatibleKey & k);
- template< class CompatibleKey >
- const info_type & ``[link reference_set_of_info_at_key info_at]``(const CompatibleKey & k) const;
- // }
- // }
- // }
- };
- // view comparison
- bool operator==(const this_type & v1, const this_type & v2 );
- bool operator< (const this_type & v1, const this_type & v2 );
- bool operator!=(const this_type & v1, const this_type & v2 );
- bool operator> (const this_type & v1, const this_type & v2 );
- bool operator>=(const this_type & v1, const this_type & v2 );
- bool operator<=(const this_type & v1, const this_type & v2 );
- } // namespace views
- } // namespace bimap
- } // namespace boost
- [/ Functions that may be implemented some day
- template< class Modifier>
- bool ``[link reference_set_of_modify_iterator_modifier modify]``(iterator position, Modifier mod);
- template< class CompatibleKey, class CompatibleCompare >
- iterator find(const CompatibleKey & x,
- const CompatibleCompare & comp);
- template< class CompatibleKey, class CompatibleCompare >
- const_iterator find(const CompatibleKey & x,
- const CompatibleCompare & comp) const;
- template< class CompatibleKey, class CompatibleCompare >
- size_type count(const CompatibleKey & x,
- const CompatibleCompare & comp) const;
- template< class CompatibleKey, class CompatibleCompare >
- iterator lower_bound(const CompatibleKey & x,
- const CompatibleCompare & comp);
- template< class CompatibleKey, class CompatibleCompare >
- const_iterator lower_bound(const CompatibleKey & x,
- const CompatibleCompare & comp) const;
- template< class CompatibleKey, class CompatibleCompare >
- iterator upper_bound(const CompatibleKey & x,
- const CompatibleCompare & comp);
- template< class CompatibleKey, class CompatibleCompare >
- const_iterator upper_bound(const CompatibleKey & x,
- const CompatibleCompare & comp) const;
- template< class CompatibleKey, class CompatibleCompare >
- std::pair<iterator,iterator> equal_range(
- const CompatibleKey & x, const CompatibleCompare & comp);
- template< class CompatibleKey, class CompatibleCompare >
- std::pair<const_iterator,const_iterator> equal_range(
- const CompatibleKey & x, const CompatibleCompare & comp) const;
- ]
- In the case of a `bimap< {multi}set_of<Left>, ... >`
- In the set view:
- typedef signature-compatible with relation< Left, ... > key_type;
- typedef signature-compatible with relation< const Left, ... > value_type;
- In the left map view:
- typedef Left key_type;
- typedef ... data_type;
- typedef signature-compatible with std::pair< const Left, ... > value_type;
- In the right map view:
- typedef ... key_type;
- typedef Left data_type;
- typedef signature-compatible with std::pair< ... ,const Left > value_type;
- [#set_of_complexity_signature]
- [section Complexity signature]
- Here and in the descriptions of operations of this view, we adopt the
- scheme outlined in the [link complexity_signature_explanation complexity signature section].
- The complexity signature of \[multi\]set_of view is:
- * copying: `c(n) = n * log(n)`,
- * insertion: `i(n) = log(n)`,
- * hinted insertion: `h(n) = 1` (constant) if the hint element precedes the point of
- insertion, `h(n) = log(n)` otherwise,
- * deletion: `d(n) = 1` (amortized constant),
- * replacement: `r(n) = 1` (constant) if the element position does not change,
- `r(n) = log(n)` otherwise,
- * modifying: `m(n) = 1` (constant) if the element position does not change,
- `m(n) = log(n)` otherwise.
- [endsect]
- [section Instantiation types]
- Set views are instantiated internally to a `bimap`.
- Instantiations are dependent on the following types:
- * `Value` from the set specifier,
- * `Allocator` from `bimap`,
- * `Compare` from the set specifier.
- `Compare` is a __SGI_STRICT_WEAK_ORDERING__ on elements of `Value`.
- [endsect]
- [section Constructors, copy and assignment]
- Set views do not have public constructors or destructors.
- Assignment, on the other hand, is provided.
- this_type & operator=(const this_type & x);
- * [*Effects: ] `a = b;`
- where a and b are the `bimap` objects to which `*this` and x
- belong, respectively.
- * [*Returns: ] `*this`.
- [endsect]
- [section Modifiers]
- [#reference_set_of_insert_value]
- std::pair<iterator,bool> insert(const value_type & x);
- * [*Effects:] Inserts `x` into the `bimap` to which the set view belongs if
- * the set view is non-unique OR no other element with equivalent key exists,
- * AND insertion is allowed by the other set specifications the `bimap`.
- * [*Returns:] The return value is a pair `p`. `p.second` is `true` if and only if insertion
- took place. On successful insertion, `p.first` points to the element inserted;
- otherwise, `p.first` points to an element that caused the insertion to be banned.
- Note that more than one element can be causing insertion not to be allowed.
- * [link set_of_complexity_signature
- [*Complexity:]] O(I(n)).
- * [*Exception safety:] Strong.
- [#reference_set_of_insert_iterator_value]
- iterator insert(iterator position, const value_type & x);
- * [*Requires: ] `position` is a valid iterator of the view.
- * [*Effects: ] `position` is used as a hint to improve the efficiency of the operation. Inserts `x` into the `bimap` to which the view belongs if
- * the set view is non-unique OR no other element with equivalent key exists,
- * AND insertion is allowed by all other views of the `bimap`.
- * [*Returns:] On successful insertion, an iterator to the newly inserted
- element. Otherwise, an iterator to an element that caused the insertion to be
- banned. Note that more than one element can be causing insertion not to be allowed.
- * [link set_of_complexity_signature
- [*Complexity:]] O(H(n)).
- * [*Exception safety:] Strong.
- [#reference_set_of_insert_iterator_iterator]
- template< class InputIterator >
- void insert(InputIterator first, InputIterator last);
- * [*Requires: ] `InputIterator` is a model of __SGI_INPUT_ITERATOR__ over elements of
- type `value_type` or a type convertible to value_type. `first` and `last` are not
- iterators into any view of the `bimap` to which this index
- belongs. `last` is reachable from `first`.
- * [*Effects: ]
- `iterator hint = end()`;
- `while( first != last ) hint = insert( hint, *first++ );`
- * [link set_of_complexity_signature
- [*Complexity:]] O(m*H(n+m)), where m is the number of elements in
- `[first, last)`.
- * [*Exception safety:] Basic.
- [#reference_set_of_erase_iterator]
- iterator erase(iterator position);
- * [*Requires: ] `position` is a valid dereferenceable iterator if the set view.
- * [*Effects:] Deletes the element pointed to by `position`.
- * [*Returns:] An iterator pointing to the element immediately following
- the one that was deleted, or `end()` if no such element exists.
- * [link set_of_complexity_signature
- [*Complexity:]] O(D(n)).
- * [*Exception safety:] nothrow.
- [#reference_set_of_erase_key]
- template< class CompatibleKey >
- size_type erase(const CompatibleKey & x);
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects:] Deletes the elements with key equivalent to `x`.
- * [*Returns:] Number of elements deleted.
- * [link set_of_complexity_signature
- [*Complexity:]] O(log(n) + m*D(n)), where m is the number of elements deleted.
- * [*Exception safety:] Basic.
- [#reference_set_of_erase_iterator_iterator]
- iterator erase(iterator first, iterator last);
- * [*Requires: ] `[first,last)` is a valid range of the view.
- * [*Effects:] Deletes the elements in `[first,last)`.
- * [*Returns:] last.
- * [link set_of_complexity_signature
- [*Complexity:]] O(log(n) + m*D(n)), where m is the number of elements
- in `[first,last)`.
- * [*Exception safety:] nothrow.
- [#reference_set_of_replace_iterator_value]
- bool replace(iterator position, const value_type& x);
- * [*Requires: ] `position` is a valid dereferenceable iterator of the set view.
- * [*Effects:] Assigns the value `x` to the element pointed to by `position` into
- the `bimap` to which the set view belongs if, for the value `x`
- * the set view is non-unique OR no other element with equivalent key exists
- (except possibly `*position`),
- * AND replacing is allowed by all other views of the `bimap`.
- * [*Postconditions:] Validity of position is preserved in all cases.
- * [*Returns: ] `true` if the replacement took place, `false` otherwise.
- * [link set_of_complexity_signature
- [*Complexity:]] O(R(n)).
- * [*Exception safety:] Strong. If an exception is thrown by some user-provided
- operation, the `bimap` to which the set view belongs remains in
- its original state.
- [#reference_set_of_replace_key_iterator_key]
- template< class CompatibleKey >
- bool replace_key(iterator position, const CompatibleKey & x);
- * [*Requires: ] `position` is a valid dereferenceable iterator of the set view.
- `CompatibleKey` can be assigned to `key_type`.
- * [*Effects:] Assigns the value `x` to `e.first`, where `e` is the element pointed
- to by `position` into the `bimap` to which the set view belongs if,
- * the map view is non-unique OR no other element with equivalent key exists
- (except possibly `*position`),
- * AND replacing is allowed by all other views of the `bimap`.
- * [*Postconditions:] Validity of position is preserved in all cases.
- * [*Returns: ] `true` if the replacement took place, `false` otherwise.
- * [link set_of_complexity_signature
- [*Complexity:]] O(R(n)).
- * [*Exception safety:] Strong. If an exception is thrown by some user-provided
- operation, the `bimap` to which the set view belongs remains in
- its original state.
- [#reference_set_of_replace_data_iterator_data]
- template< class CompatibleData >
- bool replace_data(iterator position, const CompatibleData & x);
- * [*Requires: ] `position` is a valid dereferenceable iterator of the set view.
- `CompatibleKey` can be assigned to `data_type`.
- * [*Effects:] Assigns the value `x` to `e.second`, where `e` is the element pointed
- to by `position` into the `bimap` to which the set view belongs if,
- * the map view is non-unique OR no other element with equivalent key exists
- (except possibly `*position`),
- * AND replacing is allowed by all other views of the `bimap`.
- * [*Postconditions:] Validity of position is preserved in all cases.
- * [*Returns: ] `true` if the replacement took place, `false` otherwise.
- * [link set_of_complexity_signature
- [*Complexity:]] O(R(n)).
- * [*Exception safety:] Strong. If an exception is thrown by some user-provided
- operation, the `bimap` to which the set view belongs remains in
- its original state.
- [#reference_set_of_modify_key_iterator_modifier]
- template< class KeyModifier >
- bool modify_key(iterator position, KeyModifier mod);
- * [*Requires: ] `KeyModifier` is a model of __SGI_UNARY_FUNCTION__ accepting arguments of
- type: `key_type&`; `position` is a valid dereferenceable iterator of the view.
- * [*Effects:] Calls `mod(e.first)` where e is the element pointed to by position and
- rearranges `*position` into all the views of the `bimap`.
- If the rearrangement fails, the element is erased.
- Rearrangement is successful if
- * the map view is non-unique OR no other element with equivalent key exists,
- * AND rearrangement is allowed by all other views of the `bimap`.
- * [*Postconditions:] Validity of `position` is preserved if the operation succeeds.
- * [*Returns: ] `true` if the operation succeeded, `false` otherwise.
- * [link set_of_complexity_signature
- [*Complexity:]] O(M(n)).
- * [*Exception safety:] Basic. If an exception is thrown by some user-provided
- operation (except possibly mod), then the element pointed to by position is erased.
- * [*Note:] Only provided for map views.
- [#reference_set_of_modify_data_iterator_modifier]
- template< class DataModifier >
- bool modify_data(iterator position, DataModifier mod);
- * [*Requires: ] `DataModifier` is a model of __SGI_UNARY_FUNCTION__ accepting arguments of
- type: `data_type&`; `position` is a valid dereferenceable iterator of the view.
- * [*Effects:] Calls `mod(e.second)` where e is the element pointed to by position and
- rearranges `*position` into all the views of the `bimap`.
- If the rearrangement fails, the element is erased.
- Rearrangement is successful if
- * the oppositte map view is non-unique OR no other element with equivalent key in that
- view exists,
- * AND rearrangement is allowed by all other views of the `bimap`.
- * [*Postconditions:] Validity of `position` is preserved if the operation succeeds.
- * [*Returns: ] `true` if the operation succeeded, `false` otherwise.
- * [link set_of_complexity_signature
- [*Complexity:]] O(M(n)).
- * [*Exception safety:] Basic. If an exception is thrown by some user-provided
- operation (except possibly mod), then the element pointed to by position is erased.
- * [*Note:] Only provided for map views.
- [/
- [#reference_set_of_modify_iterator_modifier]
- template< class Modifier >
- bool modify(iterator position, Modifier mod);
- * [*Requires: ] `Modifier` is a model of __SGI_BINARY_FUNCTION__ accepting arguments of
- type: `first_type&` and `second_type&` for ['Map View] or `left_type&` and `right_type&`
- ['Set View]; `position` is a valid dereferenceable iterator of the view.
- * [*Effects:] Calls `mod(e.first,e.second)` for ['Map View] or Calls `mod(e.left,e.right)`
- for ['Set View] where e is the element pointed to by position and rearranges `*position`
- into all the views of the `bimap`.
- If the rearrangement fails, the element is erased.
- Rearrangement is successful if
- * the view is non-unique OR no other element with equivalent key exists,
- * AND rearrangement is allowed by all other views of the `bimap`.
- * [*Postconditions:] Validity of `position` is preserved if the operation succeeds.
- * [*Returns: ] `true` if the operation succeeded, `false` otherwise.
- * [link set_of_complexity_signature
- [*Complexity:]] O(M(n)).
- * [*Exception safety:] Basic. If an exception is thrown by some user-provided
- operation (except possibly mod), then the element pointed to by position is erased.
- ]
- [endsect]
- [section Set operations]
- `[multi]set_of` views provide the full lookup functionality required by
- __SGI_SORTED_ASSOCIATIVE_CONTAINER__ and __SGI_UNIQUE_ASSOCIATIVE_CONTAINER__,
- namely `find`, `count`, `lower_bound`, `upper_bound` and `equal_range`.
- Additionally, these member functions are templatized to allow for non-standard
- arguments, so extending the types of search operations allowed.
- [/
- The kinds of arguments permissible when invoking the lookup member functions
- are defined by the following concept.
- Consider a __SGI_STRICT_WEAK_ORDERING__ `Compare` over values of type `Key`. A pair of
- types `(CompatibleKey, CompatibleCompare)` is said to be a ['compatible extension]
- of Compare if
- * `CompatibleCompare` is a __SGI_BINARY_PREDICATE__ over `(Key, CompatibleKey)`,
- * `CompatibleCompare` is a __SGI_BINARY_PREDICATE__ over `(CompatibleKey, Key)`,
- * if `c_comp(ck,k1)` then `!c_comp(k1,ck)`,
- * if `!c_comp(ck,k1)` and `!comp(k1,k2)` then `!c_comp(ck,k2)`,
- * if `!c_comp(k1,ck)` and `!comp(k2,k1)` then `!c_comp(k2,ck)`,
- for every `c_comp` of type `CompatibleCompare`, `comp` of type `Compare`, `ck` of type
- `CompatibleKey` and `k1`, `k2` of type `Key`.
- ]
- A type `CompatibleKey` is said to be a ['compatible key] of `Compare`
- if `(CompatibleKey, Compare)` is a compatible extension of `Compare`. This implies
- that `Compare`, as well as being a strict weak ordering, accepts arguments of type
- `CompatibleKey`, which usually means it has several overloads of `operator()`.
- [/
- In the context of a compatible extension or a compatible key, the expressions
- "equivalent", "less than" and "greater than" take on their obvious interpretations.
- ]
- [#reference_set_of_find_key]
- template< class CompatibleKey >
- iterator find(const CompatibleKey & x);
- template< class CompatibleKey >
- const_iterator find(const CompatibleKey & x) const;
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects:] Returns a pointer to an element whose key is equivalent to `x`, or
- `end()` if such an element does not exist.
- * [*Complexity:] O(log(n)).
- [/
- template< class CompatibleKey, class CompatibleCompare >
- iterator find(const CompatibleKey & x,
- const CompatibleCompare & comp);
- template< class CompatibleKey, class CompatibleCompare >
- const_iterator find(const CompatibleKey & x,
- const CompatibleCompare & comp) const;
- * [*Requires: ] `(CompatibleKey, CompatibleCompare)` is a compatible extension of
- `key_compare.`
- * [*Effects:] Returns a pointer to an element whose key is
- equivalent to `x`, or `end()` if such an element does not exist.
- * [*Complexity:] O(log(n)).
- ]
- [#reference_set_of_count_key]
- template< class CompatibleKey >
- size_type count(const key_type & x) const;
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects:] Returns the number of elements with key equivalent to `x`.
- * [*Complexity:] O(log(n) + count(x)).
- [/
- template< class CompatibleKey, class CompatibleCompare >
- size_type count(const CompatibleKey & x,
- const CompatibleCompare & comp) const;
- * [*Requires: ] `(CompatibleKey, CompatibleCompare)` is a compatible extension of
- `key_compare.`
- * [*Effects:] Returns the number of elements with key equivalent to `x`.
- * [*Complexity:] O(log(n) + count(x)).
- ]
- [#reference_set_of_lower_bound_key]
- template< class CompatibleKey >
- iterator lower_bound(const key_type & x);
- template< class CompatibleKey >
- const_iterator lower_bound(const key_type & x) const;
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects:] Returns an iterator pointing to the first element with key not
- less than `x`, or `end()` if such an element does not exist.
- * [*Complexity:] O(log(n)).
- [#reference_set_of_upper_bound_key]
- template< class CompatibleKey >
- iterator upper_bound(const key_type & x);
- template< class CompatibleKey >
- const_iterator upper_bound(const key_type & x) const;
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects:] Returns an iterator pointing to the first element with key greater
- than `x`, or `end()` if such an element does not exist.
- * [*Complexity:] O(log(n)).
- [#reference_set_of_equal_range_key]
- template< class CompatibleKey >
- std::pair<iterator,iterator>
- equal_range(const key_type & x);
- template< class CompatibleKey >
- std::pair<const_iterator,const_iterator>
- equal_range(const key_type & x) const;
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects:] Equivalent to `make_pair(lower_bound(x),upper_bound(x))`.
- * [*Complexity:] O(log(n)).
- [endsect]
- [section Range operations]
- The member function range is not defined for sorted associative
- containers, but `[multi]set_of` map views provide it as a convenient utility.
- A range or interval is defined by two conditions for the lower and upper
- bounds, which are modelled after the following concepts.
- Consider a __SGI_STRICT_WEAK_ORDERING__ `Compare` over values of type Key.
- A type `LowerBounder` is said to be a lower bounder of `Compare` if
- * `LowerBounder` is a `Predicate` over `Key`,
- * if `lower(k1)` and `!comp(k2,k1)` then `lower(k2)`,
- for every `lower` of type `LowerBounder`, `comp` of type `Compare`, and `k1`, `k2`
- of type `Key`.
- Similarly, an upper bounder is a type `UpperBounder` such that
- * `UpperBounder` is a `Predicate` over `Key`,
- * if `upper(k1)` and `!comp(k1,k2)` then `upper(k2)`,
- for every `upper` of type `UpperBounder`, `comp` of type `Compare`, and `k1`, `k2`
- of type `Key`.
- [#reference_set_of_range_lower_upper]
- template< class LowerBounder, class UpperBounder>
- std::pair<const_iterator,const_iterator> range(
- LowerBounder lower, UpperBounder upper) const;
- * [*Requires: ] `LowerBounder` and `UpperBounder` are a lower and upper bounder of
- `key_compare`, respectively.
- * [*Effects:] Returns a pair of iterators pointing to
- the beginning and one past the end of the subsequence of elements satisfying
- lower and upper simultaneously. If no such elements exist, the iterators both
- point to the first element satisfying lower, or else are equal to `end()` if this
- latter element does not exist.
- * [*Complexity:] O(log(n)).
- * [*Variants:] In place of lower or upper (or both), the singular value
- `boost::bimap::unbounded` can be provided. This acts as a predicate which
- all values of type `key_type` satisfy.
- * [*Note:] Only provided for map views.
- [endsect]
- [section at(), info_at() and operator\[\] - set_of only]
- [#reference_set_of_at_key_const]
- template< class CompatibleKey >
- const data_type & at(const CompatibleKey & k) const;
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects:] Returns the `data_type` reference that is associated with `k`, or
- throws `std::out_of_range` if such key does not exist.
- * [*Complexity:] O(log(n)).
- * [*Note:] Only provided when `set_of` is used.
- The symmetry of bimap imposes some constraints on `operator[]` and the
- non constant version of at() that are not found in `std::maps`.
- Tey are only provided if the other collection type is mutable
- (`list_of`, `vector_of` and `unconstrained_set_of`).
- [#reference_set_of_operator_bracket_key]
- template< class CompatibleKey >
- data_type & operator[](const CompatibleKey & k);
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects: ] `return insert(value_type(k,data_type()))->second;`
- * [*Complexity:] O(log(n)).
- * [*Note:] Only provided when `set_of` is used and the other collection
- type is mutable.
- [#reference_set_of_at_key]
- template< class CompatibleKey >
- data_type & at(const CompatibleKey & k);
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects: ] Returns the `data_type` reference that is associated with `k`, or
- throws `std::out_of_range` if such key does not exist.
- * [*Complexity:] O(log(n)).
- * [*Note:] Only provided when `set_of` is used and the other collection
- type is mutable.
- [/
- The symmetry of bimap imposes some constraints on `operator[]` that are
- not found in `std::maps`. If other views are unique,
- `bimap::duplicate_value` is thrown whenever an assignment is attempted to
- a value that is already a key in these views. As for
- `bimap::value_not_found`, this exception is thrown while trying to access
- a non-existent key: this behaviour differs from that of `std::map`, which
- automatically assigns a default value to non-existent keys referred to
- by `operator[]`.
- const data_type & operator[](const typename key_type & k) const;
- * [*Effects:] Returns the `data_type` reference that is associated with `k`, or
- throws `bimap::value_not_found` if such an element does not exist.
- * [*Complexity:] O(log(n)).
- ``['-unspecified data_type proxy-]`` operator[](const typename key_type & k);
- * [*Effects:] Returns a proxy to a `data_type` associated with `k` and the
- bimap. The proxy behaves as a reference to the `data_type` object. If this
- proxy is read and `k` was not in the bimap, the bimap::value_not_found is
- thrown. If it is written then `bimap::duplicate_value` is thrown if the
- assignment is not allowed by one of the other views of the `bimap`.
- * [link set_of_complexity_signature
- [*Complexity:]] If the assignment operator of the proxy is not used, then
- the order is O(log(n)). If it is used, the order is O(I(n)) if `k` was not
- in the bimap and O(R(n)) if it existed in the bimap.
- ]
- [#reference_set_of_info_at_key]
- template< class CompatibleKey >
- info_type & info_at(const CompatibleKey & k);
- template< class CompatibleKey >
- const info_type & info_at(const CompatibleKey & k) const;
- * [*Requires: ] `CompatibleKey` is a compatible key of `key_compare`.
- * [*Effects:] Returns the `info_type` reference that is associated with `k`, or
- throws `std::out_of_range` if such key does not exist.
- * [*Complexity:] O(log(n)).
- * [*Note:] Only provided when `set_of` and `info_hook` are used
- [endsect]
- [section Serialization]
- Views cannot be serialized on their own, but only as part of the `bimap`
- into which they are embedded. In describing the additional preconditions and guarantees
- associated to `[multi]set_of` views with respect to serialization of their embedding containers,
- we use the concepts defined in the `bimap` serialization section.
- [blurb [*Operation:] saving of a `bimap` m to an output archive (XML archive) ar.]
- * [*Requires:] No additional requirements to those imposed by the container.
- [blurb [*Operation:] loading of a `bimap` m' from an input archive (XML archive) ar.]
- * [*Requires:] In addition to the general requirements, `value_comp()` must be
- serialization-compatible with `m.get<i>().value_comp()`, where i is the position
- of the ordered view in the container.
- * [*Postconditions:] On successful loading, each of the elements of `[begin(), end())`
- is a restored copy of the corresponding element in `[m.get<i>().begin(), m.get<i>().end())`.
- [blurb [*Operation:] saving of an iterator or `const_iterator` it to an output archive
- (XML archive) ar.]
- * [*Requires: ] `it` is a valid iterator of the view. The associated `bimap`
- has been previously saved.
- [blurb [*Operation:] loading of an `iterator` or `const_iterator` `it`' from an input archive (
- XML archive) ar.]
- * [*Postconditions:] On successful loading, if it was dereferenceable then `*it`' is the
- restored copy of `*it`, otherwise `it`'` == end()`.
- * [*Note:] It is allowed that it be a `const_iterator` and the restored `it`' an iterator,
- or viceversa.
- [endsect]
- [endsect]
- [endsect]