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>
362template <
typename... Args>
363std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
364vector_map<K, T, C, A>::emplace(Args&&... args)
366 value_type x{ std::forward<Args>(args)... };
367 return insert(std::move(x));
372template <
typename K,
typename T,
typename C,
typename A>
373template <
typename... Args>
374typename vector_map<K, T, C, A>::iterator
375vector_map<K, T, C, A>::emplace_hint(const_iterator hint, Args&&... args)
377 value_type x{ std::forward<Args>(args)... };
378 return is_insert_position(hint, x.first)
379 ? data_.insert(hint, std::move(x))
380 : insert(std::move(x)).first;
384template <
typename K,
typename T,
typename C,
typename A>
385template<
typename... Args>
386std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
387vector_map<K, T, C, A>::try_emplace(
const key_type& key, Args&&... args)
389 iterator i = lower_bound(key);
390 if (i == end() || key_comp_(key, i->first))
392 i = data_.emplace(i, key, std::forward<Args>(args)...);
393 return std::make_pair(i,
true);
395 return std::make_pair(i,
false);
399template <
typename K,
typename T,
typename C,
typename A>
400template<
typename... Args>
401std::pair<typename vector_map<K, T, C, A>::iterator,
bool>
402vector_map<K, T, C, A>::try_emplace(key_type&& key, Args&&... args)
404 key_type k{ std::move(key) };
405 iterator i = lower_bound(k);
406 if (i == end() || key_comp_(k, i->first))
408 i = data_.emplace(i, std::move(k), std::forward<Args>(args)...);
409 return std::make_pair(i,
true);
411 return std::make_pair(i,
false);
415template <
typename K,
typename T,
typename C,
typename A>
416template<
typename... Args>
417typename vector_map<K, T, C, A>::iterator
418vector_map<K, T, C, A>::try_emplace(const_iterator hint,
const key_type& key, Args&&... args)
420 return is_insert_position(hint, key)
421 ? data_.emplace(hint, key, std::forward<Args>(args)...)
422 : try_emplace(key, std::forward<Args>(args)...).first;
426template <
typename K,
typename T,
typename C,
typename A>
427template<
typename... Args>
428typename vector_map<K, T, C, A>::iterator
429vector_map<K, T, C, A>::try_emplace(const_iterator hint, key_type&& key, Args&&... args)
431 key_type k{ std::move(key) };
432 return is_insert_position(hint, k)
433 ? data_.emplace(hint, std::move(k), std::forward<Args>(args)...)
434 : try_emplace(std::move(k), std::forward<Args>(args)...).first;
438template <
typename K,
typename T,
typename C,
typename A>
inline
439void vector_map<K, T, C, A>::erase(const_iterator i)
446template <
typename K,
typename T,
typename C,
typename A>
447typename vector_map<K, T, C, A>::size_type
448vector_map<K, T, C, A>::erase(
const key_type& x)
450 const const_iterator i = find(x);
461template <
typename K,
typename T,
typename C,
typename A>
inline
462void vector_map<K, T, C, A>::erase(const_iterator first, const_iterator last)
464 data_.erase(first, last);
469template <
typename K,
typename T,
typename C,
typename A>
inline
470void vector_map<K, T, C, A>::swap(vector_map<K, T, C, A>& other)
noexcept
472 data_.swap(other.data_);
473 std::swap(key_comp_, other.key_comp_);
478template <
typename K,
typename T,
typename C,
typename A>
inline
479void vector_map<K, T, C, A>::clear() noexcept
486template <
typename K,
typename T,
typename C,
typename A>
inline
487typename vector_map<K, T, C, A>::key_compare
488vector_map<K, T, C, A>::key_comp()
const
495template <
typename K,
typename T,
typename C,
typename A>
inline
496typename vector_map<K, T, C, A>::value_compare
497vector_map<K, T, C, A>::value_comp()
const
499 return value_compare(key_comp_);
504template <
typename K,
typename T,
typename C,
typename A>
505typename vector_map<K, T, C, A>::iterator
506vector_map<K, T, C, A>::find(
const key_type& key)
508 const iterator i = lower_bound(key);
509 if (i == end() || key_comp_(key, i->first))
518template <
typename K,
typename T,
typename C,
typename A>
519typename vector_map<K, T, C, A>::const_iterator
520vector_map<K, T, C, A>::find(
const key_type& key)
const
522 const const_iterator i = lower_bound(key);
523 if (i == end() || key_comp_(key, i->first))
532template <
typename K,
typename T,
typename C,
typename A>
inline
533typename vector_map<K, T, C, A>::size_type
534vector_map<K, T, C, A>::count(
const key_type& key)
const
536 return find(key) != end() ? 1 : 0;
541template <
typename K,
typename T,
typename C,
typename A>
inline
542bool vector_map<K, T, C, A>::contains(
const key_type& key)
const
544 return find(key) != end();
549template <
typename K,
typename T,
typename C,
typename A>
inline
550typename vector_map<K, T, C, A>::iterator
551vector_map<K, T, C, A>::lower_bound(
const key_type& key)
553 return std::lower_bound(data_.begin(), data_.end(), key,
554 [
this](
const value_type& x,
const key_type& k) { return key_comp_(x.first, k); });
559template <
typename K,
typename T,
typename C,
typename A>
inline
560typename vector_map<K, T, C, A>::const_iterator
561vector_map<K, T, C, A>::lower_bound(
const key_type& key)
const
563 return std::lower_bound(data_.cbegin(), data_.cend(), key,
564 [
this](
const value_type& x,
const key_type& k) { return key_comp_(x.first, k); });
570template <
typename K,
typename T,
typename C,
typename A>
inline
571typename vector_map<K, T, C, A>::iterator
572vector_map<K, T, C, A>::upper_bound(
const key_type& key)
574 return std::upper_bound(data_.begin(), data_.end(), key,
575 [
this](
const key_type& k,
const value_type& x) { return key_comp_(k, x.first); });
581template <
typename K,
typename T,
typename C,
typename A>
inline
582typename vector_map<K, T, C, A>::const_iterator
583vector_map<K, T, C, A>::upper_bound(
const key_type& key)
const
585 return std::upper_bound(data_.cbegin(), data_.cend(), key,
586 [
this](
const key_type& k,
const value_type& x) { return key_comp_(k, x.first); });
591template <
typename K,
typename T,
typename C,
typename A>
inline
592std::pair<typename vector_map<K, T, C, A>::iterator,
typename vector_map<K, T, C, A>::iterator>
593vector_map<K, T, C, A>::equal_range(
const key_type& key)
595 const value_type k(key, mapped_type{});
596 return std::equal_range(data_.begin(), data_.end(), k,
597 [
this](
const value_type& a,
const value_type& b) { return key_comp_(a.first, b.first); });
602template <
typename K,
typename T,
typename C,
typename A>
inline
603std::pair<typename vector_map<K, T, C, A>::const_iterator,
typename vector_map<K, T, C, A>::const_iterator>
604vector_map<K, T, C, A>::equal_range(
const key_type& key)
const
606 const value_type k(key, mapped_type{});
607 return std::equal_range(data_.cbegin(), data_.cend(), k,
608 [
this](
const value_type& a,
const value_type& b) { return key_comp_(a.first, b.first); });
613template <
typename K,
typename T,
typename C,
typename A>
614bool vector_map<K, T, C, A>::is_insert_position(const_iterator hint,
const key_type& key)
const
617 return (hint == cend() || key_comp_(key, hint->first)) &&
618 (hint == cbegin() || key_comp_(stde::prev(hint)->first, key));
626template <
typename K,
typename T,
typename C,
typename A>
627bool operator==(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
629 return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin(), a.value_comp());
636template <
typename K,
typename T,
typename C,
typename A>
inline
637bool operator!=(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
646template <
typename K,
typename T,
typename C,
typename A>
inline
647bool operator<(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
649 return std::lexicographical_compare(a.begin(), a.end(), b.begin, b.end(), a.value_comp());
656template <
typename K,
typename T,
typename C,
typename A>
inline
657bool operator>(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
666template <
typename K,
typename T,
typename C,
typename A>
inline
667bool operator<=(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
676template <
typename K,
typename T,
typename C,
typename A>
inline
677bool operator>=(
const vector_map<K, T, C, A>& a,
const vector_map<K, T, C, A>& b)
686template <
typename K,
typename T,
typename C,
typename A,
typename Char,
typename Traits>
687std::basic_ostream<Char, Traits>&
688operator<<(std::basic_ostream<Char, Traits>& ostream, vector_map<K, T, C, A>& container)
690 return impl::print_map<Char>(ostream, container.begin(), container.end(),
"{",
", ",
": ",
"}");
697template <
typename Char,
typename Traits,
typename K,
typename T,
typename C,
typename A>
698std::basic_istream<Char, Traits>&
699operator>>(std::basic_istream<Char, Traits>& istream, vector_map<K, T, C, A>& container)
701 return impl::read_container<impl::set_traits, impl::pair_traits, std::pair<K, T>, Char>(
702 istream, container,
'{',
',',
':',
'}');
714template <
typename K,
typename T,
typename C,
typename A>
715void 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.