50template <
typename K,
typename T,
typename C,
typename A>
51vector_map<K, T, C, A>::vector_map(
const key_compare& key_comp,
const allocator_type& allocator):
59template <
typename K,
typename T,
typename C,
typename A>
60template <
typename InputIterator>
61vector_map<K, T, C, A>::vector_map(InputIterator first, InputIterator last,
62 const key_compare& key_comp,
const allocator_type& allocator):
63 data_(first, last, allocator),
66 std::stable_sort(data_.begin(), data_.end(), value_compare(key_comp_));
67 iterator end = std::unique(data_.begin(), data_.end(),
68 [
this](
const value_type& a,
const value_type& b) { return !key_comp_(a.first, b.first) && !key_comp_(b.first, a.first); });
69 data_.erase(end, data_.end());
74template <
typename K,
typename T,
typename C,
typename A>
75vector_map<K, T, C, A>::vector_map(
const vector_map<K, T, C, A>& other):
77 key_comp_(other.key_comp_)
83template <
typename K,
typename T,
typename C,
typename A>
84vector_map<K, T, C, A>::vector_map(vector_map<K, T, C, A>&& other)
noexcept:
85 data_(std::move(other.data_)),
86 key_comp_(std::move(other.key_comp_))
92template <
typename K,
typename T,
typename C,
typename A>
93vector_map<K, T, C, A>::vector_map(std::initializer_list<value_type> init,
94 const key_compare& key_comp,
const allocator_type& allocator):
95 vector_map(init.begin(), init.end(), key_comp, allocator)
101template <
typename K,
typename T,
typename C,
typename A>
102vector_map<K, T, C, A>::~vector_map()
108template <
typename K,
typename T,
typename C,
typename A>
109vector_map<K, T, C, A>& vector_map<K, T, C, A>::operator=(
const vector_map<K, T, C, A>& other)
111 vector_map<K, T, C, A> temp(other);
118template <
typename K,
typename T,
typename C,
typename A>
119vector_map<K, T, C, A>& vector_map<K, T, C, A>::operator=(vector_map<K, T, C, A>&& other)
noexcept
121 vector_map<K, T, C, A> temp(std::move(other));
128template <
typename K,
typename T,
typename C,
typename A>
inline
129typename vector_map<K, T, C, A>::iterator
130vector_map<K, T, C, A>::begin() noexcept
132 return data_.begin();
137template <
typename K,
typename T,
typename C,
typename A>
inline
138typename vector_map<K, T, C, A>::const_iterator
139vector_map<K, T, C, A>::begin() const noexcept
141 return data_.begin();
146template <
typename K,
typename T,
typename C,
typename A>
inline
147typename vector_map<K, T, C, A>::const_iterator
148vector_map<K, T, C, A>::cbegin() const noexcept
150 return data_.cbegin();
155template <
typename K,
typename T,
typename C,
typename A>
inline
156typename vector_map<K, T, C, A>::iterator
157vector_map<K, T, C, A>::end() noexcept
164template <
typename K,
typename T,
typename C,
typename A>
inline
165typename vector_map<K, T, C, A>::const_iterator
166vector_map<K, T, C, A>::end() const noexcept
173template <
typename K,
typename T,
typename C,
typename A>
inline
174typename vector_map<K, T, C, A>::const_iterator
175vector_map<K, T, C, A>::cend() const noexcept
182template <
typename K,
typename T,
typename C,
typename A>
inline
183typename vector_map<K, T, C, A>::reverse_iterator
184vector_map<K, T, C, A>::rbegin() noexcept
186 return data_.rbegin();
191template <
typename K,
typename T,
typename C,
typename A>
inline
192typename vector_map<K, T, C, A>::const_reverse_iterator
193vector_map<K, T, C, A>::rbegin() const noexcept
195 return data_.rbegin();
200template <
typename K,
typename T,
typename C,
typename A>
inline
201typename vector_map<K, T, C, A>::const_reverse_iterator
202vector_map<K, T, C, A>::crbegin() const noexcept
204 return data_.crbegin();
209template <
typename K,
typename T,
typename C,
typename A>
inline
210typename vector_map<K, T, C, A>::reverse_iterator
211vector_map<K, T, C, A>::rend() noexcept
218template <
typename K,
typename T,
typename C,
typename A>
inline
219typename vector_map<K, T, C, A>::const_reverse_iterator
220vector_map<K, T, C, A>::rend() const noexcept
227template <
typename K,
typename T,
typename C,
typename A>
inline
228typename vector_map<K, T, C, A>::const_reverse_iterator
229vector_map<K, T, C, A>::crend() const noexcept
231 return data_.crend();
236template <
typename K,
typename T,
typename C,
typename A>
inline
237bool vector_map<K, T, C, A>::empty() const noexcept
239 return data_.empty();
244template <
typename K,
typename T,
typename C,
typename A>
inline
245typename vector_map<K, T, C, A>::size_type
246vector_map<K, T, C, A>::size() const noexcept
253template <
typename K,
typename T,
typename C,
typename A>
inline
254typename vector_map<K, T, C, A>::size_type
255vector_map<K, T, C, A>::max_size() const noexcept
257 return data_.max_size();
262template <
typename K,
typename T,
typename C,
typename A>
inline
263typename vector_map<K, T, C, A>::mapped_type&
264vector_map<K, T, C, A>::at(
const key_type& key)
269 throw std::out_of_range(
"no such element");
276template <
typename K,
typename T,
typename C,
typename A>
inline
277const typename vector_map<K, T, C, A>::mapped_type&
278vector_map<K, T, C, A>::at(
const key_type& key)
const
283 throw std::out_of_range(
"no such element");
290template <
typename K,
typename T,
typename C,
typename A>
inline
291typename vector_map<K, T, C, A>::mapped_type&
292vector_map<K, T, C, A>::operator[](
const key_type& key)
294 return (try_emplace(key, mapped_type()).first)->second;
299template <
typename K,
typename T,
typename C,
typename A>
inline
300typename vector_map<K, T, C, A>::mapped_type&
301vector_map<K, T, C, A>::operator[](key_type&& key)
303 return (try_emplace(std::move(key), mapped_type()).first)->second;
308template <
typename K,
typename T,
typename C,
typename A>
309std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
310vector_map<K, T, C, A>::insert(
const value_type& x)
312 iterator i = lower_bound(x.first);
313 if (i == end() || key_comp_(x.first, i->first))
315 i = data_.insert(i, x);
316 return std::make_pair(i,
true);
318 return std::make_pair(i,
false);
323template <
typename K,
typename T,
typename C,
typename A>
324std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
325vector_map<K, T, C, A>::insert(value_type&& x)
327 iterator i = lower_bound(x.first);
328 if (i == end() || key_comp_(x.first, i->first))
330 i = data_.insert(i, std::move(x));
331 return std::make_pair(i,
true);
333 return std::make_pair(i,
false);
338template <
typename K,
typename T,
typename C,
typename A>
inline
339typename vector_map<K, T, C, A>::iterator
340vector_map<K, T, C, A>::insert(const_iterator hint,
const value_type& x)
342 return is_insert_position(hint, x.first)
343 ? data_.insert(hint, x)
349template <
typename K,
typename T,
typename C,
typename A>
350template <
typename InputIterator>
351void vector_map<K, T, C, A>::insert(InputIterator first, InputIterator last)
353 while (first != last)
361template <
typename K,
typename T,
typename C,
typename A>
363std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
364vector_map<K, T, C, A>::insert_or_assign(
const key_type& key, M&& obj)
366 iterator i = lower_bound(key);
367 if (i == end() || key_comp_(key, i->first))
369 i = data_.emplace(i, key, std::forward<M>(obj));
370 return std::make_pair(i,
true);
372 i->second = std::forward<M>(obj);
373 return std::make_pair(i,
false);
378template <
typename K,
typename T,
typename C,
typename A>
380std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
381vector_map<K, T, C, A>::insert_or_assign(key_type&& key, M&& obj)
383 iterator i = lower_bound(key);
384 if (i == end() || key_comp_(key, i->first))
386 i = data_.emplace(i, std::move(key), std::forward<M>(obj));
387 return std::make_pair(i,
true);
389 i->second = std::forward<M>(obj);
390 return std::make_pair(i,
false);
395template <
typename K,
typename T,
typename C,
typename A>
397typename vector_map<K, T, C, A>::iterator
398vector_map<K, T, C, A>::insert_or_assign(const_iterator hint,
const key_type& key, M&& obj)
400 return is_insert_position(hint, key)
401 ? data_.emplace(hint, key, std::forward<M>(obj))
402 : insert_or_assign(key, std::forward<M>(obj)).first;
407template <
typename K,
typename T,
typename C,
typename A>
409typename vector_map<K, T, C, A>::iterator
410vector_map<K, T, C, A>::insert_or_assign(const_iterator hint, key_type&& key, M&& obj)
412 return is_insert_position(hint, key)
413 ? data_.emplace(hint, std::move(key), std::forward<M>(obj))
414 : insert_or_assign(std::move(key), std::forward<M>(obj)).first;
419template <
typename K,
typename T,
typename C,
typename A>
420template <
typename... Args>
421std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
422vector_map<K, T, C, A>::emplace(Args&&... args)
424 value_type x{ std::forward<Args>(args)... };
425 return insert(std::move(x));
430template <
typename K,
typename T,
typename C,
typename A>
431template <
typename... Args>
432typename vector_map<K, T, C, A>::iterator
433vector_map<K, T, C, A>::emplace_hint(const_iterator hint, Args&&... args)
435 value_type x{ std::forward<Args>(args)... };
436 return is_insert_position(hint, x.first)
437 ? data_.insert(hint, std::move(x))
438 : insert(std::move(x)).first;
442template <
typename K,
typename T,
typename C,
typename A>
443template<
typename... Args>
444std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
445vector_map<K, T, C, A>::try_emplace(
const key_type& key, Args&&... args)
447 iterator i = lower_bound(key);
448 if (i == end() || key_comp_(key, i->first))
450 i = data_.emplace(i, key, std::forward<Args>(args)...);
451 return std::make_pair(i,
true);
453 return std::make_pair(i,
false);
457template <
typename K,
typename T,
typename C,
typename A>
458template<
typename... Args>
459std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
460vector_map<K, T, C, A>::try_emplace(key_type&& key, Args&&... args)
462 key_type k{ std::move(key) };
463 iterator i = lower_bound(k);
464 if (i == end() || key_comp_(k, i->first))
466 i = data_.emplace(i, std::move(k), std::forward<Args>(args)...);
467 return std::make_pair(i,
true);
469 return std::make_pair(i,
false);
473template <
typename K,
typename T,
typename C,
typename A>
474template<
typename... Args>
475typename vector_map<K, T, C, A>::iterator
476vector_map<K, T, C, A>::try_emplace(const_iterator hint,
const key_type& key, Args&&... args)
478 return is_insert_position(hint, key)
479 ? data_.emplace(hint, key, std::forward<Args>(args)...)
480 : try_emplace(key, std::forward<Args>(args)...).first;
484template <
typename K,
typename T,
typename C,
typename A>
485template<
typename... Args>
486typename vector_map<K, T, C, A>::iterator
487vector_map<K, T, C, A>::try_emplace(const_iterator hint, key_type&& key, Args&&... args)
489 key_type k{ std::move(key) };
490 return is_insert_position(hint, k)
491 ? data_.emplace(hint, std::move(k), std::forward<Args>(args)...)
492 : try_emplace(std::move(k), std::forward<Args>(args)...).first;
496template <
typename K,
typename T,
typename C,
typename A>
inline
497void vector_map<K, T, C, A>::erase(const_iterator i)
504template <
typename K,
typename T,
typename C,
typename A>
505typename vector_map<K, T, C, A>::size_type
506vector_map<K, T, C, A>::erase(
const key_type& x)
508 const const_iterator i = find(x);
519template <
typename K,
typename T,
typename C,
typename A>
inline
520void vector_map<K, T, C, A>::erase(const_iterator first, const_iterator last)
522 data_.erase(first, last);
527template <
typename K,
typename T,
typename C,
typename A>
inline
528void vector_map<K, T, C, A>::swap(vector_map<K, T, C, A>& other)
noexcept
530 data_.swap(other.data_);
531 std::swap(key_comp_, other.key_comp_);
536template <
typename K,
typename T,
typename C,
typename A>
inline
537void vector_map<K, T, C, A>::clear() noexcept
544template <
typename K,
typename T,
typename C,
typename A>
inline
545typename vector_map<K, T, C, A>::key_compare
546vector_map<K, T, C, A>::key_comp()
const
553template <
typename K,
typename T,
typename C,
typename A>
inline
554typename vector_map<K, T, C, A>::value_compare
555vector_map<K, T, C, A>::value_comp()
const
557 return value_compare(key_comp_);
562template <
typename K,
typename T,
typename C,
typename A>
563typename vector_map<K, T, C, A>::iterator
564vector_map<K, T, C, A>::find(
const key_type& key)
566 const iterator i = lower_bound(key);
567 if (i == end() || key_comp_(key, i->first))
576template <
typename K,
typename T,
typename C,
typename A>
577typename vector_map<K, T, C, A>::const_iterator
578vector_map<K, T, C, A>::find(
const key_type& key)
const
580 const const_iterator i = lower_bound(key);
581 if (i == end() || key_comp_(key, i->first))
590template <
typename K,
typename T,
typename C,
typename A>
inline
591typename vector_map<K, T, C, A>::size_type
592vector_map<K, T, C, A>::count(
const key_type& key)
const
594 return find(key) != end() ? 1 : 0;
599template <
typename K,
typename T,
typename C,
typename A>
inline
600bool vector_map<K, T, C, A>::contains(
const key_type& key)
const
602 return find(key) != end();
607template <
typename K,
typename T,
typename C,
typename A>
inline
608typename vector_map<K, T, C, A>::iterator
609vector_map<K, T, C, A>::lower_bound(
const key_type& key)
611 return std::lower_bound(data_.begin(), data_.end(), key,
612 [
this](
const value_type& x,
const key_type& k) { return key_comp_(x.first, k); });
617template <
typename K,
typename T,
typename C,
typename A>
inline
618typename vector_map<K, T, C, A>::const_iterator
619vector_map<K, T, C, A>::lower_bound(
const key_type& key)
const
621 return std::lower_bound(data_.cbegin(), data_.cend(), key,
622 [
this](
const value_type& x,
const key_type& k) { return key_comp_(x.first, k); });
628template <
typename K,
typename T,
typename C,
typename A>
inline
629typename vector_map<K, T, C, A>::iterator
630vector_map<K, T, C, A>::upper_bound(
const key_type& key)
632 return std::upper_bound(data_.begin(), data_.end(), key,
633 [
this](
const key_type& k,
const value_type& x) { return key_comp_(k, x.first); });
639template <
typename K,
typename T,
typename C,
typename A>
inline
640typename vector_map<K, T, C, A>::const_iterator
641vector_map<K, T, C, A>::upper_bound(
const key_type& key)
const
643 return std::upper_bound(data_.cbegin(), data_.cend(), key,
644 [
this](
const key_type& k,
const value_type& x) { return key_comp_(k, x.first); });
649template <
typename K,
typename T,
typename C,
typename A>
inline
650std::pair<typename vector_map<K, T, C, A>::iterator,
typename vector_map<K, T, C, A>::iterator>
651vector_map<K, T, C, A>::equal_range(
const key_type& key)
653 const value_type k(key, mapped_type{});
654 return std::equal_range(data_.begin(), data_.end(), k,
655 [
this](
const value_type& a,
const value_type& b) { return key_comp_(a.first, b.first); });
660template <
typename K,
typename T,
typename C,
typename A>
inline
661std::pair<typename vector_map<K, T, C, A>::const_iterator,
typename vector_map<K, T, C, A>::const_iterator>
662vector_map<K, T, C, A>::equal_range(
const key_type& key)
const
664 const value_type k(key, mapped_type{});
665 return std::equal_range(data_.cbegin(), data_.cend(), k,
666 [
this](
const value_type& a,
const value_type& b) { return key_comp_(a.first, b.first); });
671template <
typename K,
typename T,
typename C,
typename A>
672bool vector_map<K, T, C, A>::is_insert_position(const_iterator hint,
const key_type& key)
const
675 return (hint == cend() || key_comp_(key, hint->first)) &&
676 (hint == cbegin() || key_comp_(stde::prev(hint)->first, key));
684template <
typename K,
typename T,
typename C,
typename A>
685bool operator==(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
687 return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin(), a.value_comp());
694template <
typename K,
typename T,
typename C,
typename A>
inline
695bool operator!=(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
704template <
typename K,
typename T,
typename C,
typename A>
inline
705bool operator<(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
707 return std::lexicographical_compare(a.begin(), a.end(), b.begin, b.end(), a.value_comp());
714template <
typename K,
typename T,
typename C,
typename A>
inline
715bool operator>(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
724template <
typename K,
typename T,
typename C,
typename A>
inline
725bool operator<=(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
734template <
typename K,
typename T,
typename C,
typename A>
inline
735bool operator>=(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
744template <
typename K,
typename T,
typename C,
typename A,
typename Char,
typename Traits>
745std::basic_ostream<Char, Traits>&
746operator<<(std::basic_ostream<Char, Traits>& ostream, vector_map<K, T, C, A>& container)
748 return impl::print_map<Char>(ostream, container.begin(), container.end(),
"{",
", ",
": ",
"}");
755template <
typename Char,
typename Traits,
typename K,
typename T,
typename C,
typename A>
756std::basic_istream<Char, Traits>&
757operator>>(std::basic_istream<Char, Traits>& istream, vector_map<K, T, C, A>& container)
759 return impl::read_container<impl::set_traits, impl::pair_traits, std::pair<K, T>, Char>(
760 istream, container,
'{',
',',
':',
'}');
772template <
typename K,
typename T,
typename C,
typename A>
773void swap(lass::stde::vector_map<K, T, C, A>& a, lass::stde::vector_map<K, T, C, A>& b)
noexcept
lass extensions to the standard library
Library for Assembled Shared Sources.