746 class vector<bool, _Alloc> :
protected _Bvector_base<_Alloc>
748 typedef _Bvector_base<_Alloc> _Base;
749 typedef typename _Base::_Bit_pointer _Bit_pointer;
750 typedef typename _Base::_Bit_alloc_traits _Bit_alloc_traits;
752#if __cplusplus >= 201103L
754# if __cplusplus > 201703L
756 "std::vector must have the same value_type as its allocator");
761 typedef bool value_type;
762 typedef size_t size_type;
763 typedef ptrdiff_t difference_type;
764 typedef _Bit_reference reference;
765 typedef bool const_reference;
766 typedef _Bit_reference* pointer;
767 typedef const bool* const_pointer;
768 typedef _Bit_iterator iterator;
769 typedef _Bit_const_iterator const_iterator;
772 typedef _Alloc allocator_type;
777 {
return _Base::get_allocator(); }
780 using _Base::_M_allocate;
781 using _Base::_M_deallocate;
782 using _Base::_S_nword;
783 using _Base::_M_get_Bit_allocator;
786#if __cplusplus >= 201103L
794 vector(
const allocator_type& __a) _GLIBCXX_NOEXCEPT
797#if __cplusplus >= 201103L
800 vector(size_type __n,
const allocator_type& __a = allocator_type())
805 vector(size_type __n,
const bool& __value,
806 const allocator_type& __a = allocator_type())
809 vector(size_type __n,
const bool& __value =
bool(),
810 const allocator_type& __a = allocator_type())
815 _M_initialize_value(__value);
820 : _Base(_Bit_alloc_traits::_S_select_on_copy(__x._M_get_Bit_allocator()))
822 const_iterator __xbegin = __x.
begin(), __xend = __x.
end();
823 _M_initialize(__x.
size());
824 _M_copy_aligned(__xbegin, __xend,
begin());
827#if __cplusplus >= 201103L
828 vector(vector&&) =
default;
844 _M_initialize(__x.
size());
845 _M_copy_aligned(__x.
begin(), __x.
end(), begin());
852 vector(vector&& __x,
const __type_identity_t<allocator_type>& __a)
853 noexcept(_Bit_alloc_traits::_S_always_equal())
859 vector(
const vector& __x,
const __type_identity_t<allocator_type>& __a)
862 _M_initialize(__x.
size());
863 _M_copy_aligned(__x.
begin(), __x.
end(), begin());
868 const allocator_type& __a = allocator_type())
871 _M_initialize_range(__l.begin(), __l.end(),
876#if __cplusplus >= 201103L
877 template<
typename _InputIterator,
878 typename = std::_RequireInputIter<_InputIterator>>
880 vector(_InputIterator __first, _InputIterator __last,
881 const allocator_type& __a = allocator_type())
884 _M_initialize_range(__first, __last,
888 template<
typename _InputIterator>
889 vector(_InputIterator __first, _InputIterator __last,
890 const allocator_type& __a = allocator_type())
894 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
895 _M_initialize_dispatch(__first, __last, _Integral());
899#if __glibcxx_containers_ranges
905 template<__detail::__container_compatible_range<
bool> _Rg>
907 vector(from_range_t, _Rg&& __rg,
const _Alloc& __a = _Alloc())
910 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
912 _M_initialize(size_type(ranges::distance(__rg)));
913 ranges::copy(__rg,
begin());
917 auto __first = ranges::begin(__rg);
918 const auto __last = ranges::end(__rg);
919 for (; __first != __last; ++__first)
920 emplace_back(*__first);
926 ~vector() _GLIBCXX_NOEXCEPT { }
934#if __cplusplus >= 201103L
935 if (_Bit_alloc_traits::_S_propagate_on_copy_assign())
937 if (this->_M_get_Bit_allocator() != __x._M_get_Bit_allocator())
939 this->_M_deallocate();
940 std::__alloc_on_copy(_M_get_Bit_allocator(),
941 __x._M_get_Bit_allocator());
942 _M_initialize(__x.
size());
945 std::__alloc_on_copy(_M_get_Bit_allocator(),
946 __x._M_get_Bit_allocator());
949 if (__x.
size() > capacity())
951 this->_M_deallocate();
952 _M_initialize(__x.
size());
954 this->_M_impl._M_finish = _M_copy_aligned(__x.
begin(), __x.
end(),
959#if __cplusplus >= 201103L
962 operator=(vector&& __x)
noexcept(_Bit_alloc_traits::_S_nothrow_move())
964 if (_Bit_alloc_traits::_S_propagate_on_move_assign()
965 || this->_M_get_Bit_allocator() == __x._M_get_Bit_allocator())
967 this->_M_deallocate();
969 std::__alloc_on_move(_M_get_Bit_allocator(),
970 __x._M_get_Bit_allocator());
974 if (__x.
size() > capacity())
976 this->_M_deallocate();
977 _M_initialize(__x.
size());
979 this->_M_impl._M_finish = _M_copy_aligned(__x.
begin(), __x.
end(),
990 this->
assign(__l.begin(), __l.end());
1001 assign(size_type __n,
const bool& __x)
1002 { _M_fill_assign(__n, __x); }
1004#if __cplusplus >= 201103L
1005 template<
typename _InputIterator,
1006 typename = std::_RequireInputIter<_InputIterator>>
1007 _GLIBCXX20_CONSTEXPR
1009 assign(_InputIterator __first, _InputIterator __last)
1012 template<
typename _InputIterator>
1014 assign(_InputIterator __first, _InputIterator __last)
1017 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1018 _M_assign_dispatch(__first, __last, _Integral());
1022#if __cplusplus >= 201103L
1023 _GLIBCXX20_CONSTEXPR
1029#if __glibcxx_containers_ranges
1036 template<__detail::__container_compatible_range<
bool> _Rg>
1038 assign_range(_Rg&& __rg)
1040 static_assert(assignable_from<bool&, ranges::range_reference_t<_Rg>>);
1041 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
1043 if (
auto __n = size_type(ranges::distance(__rg)))
1046 this->_M_impl._M_finish
1055 auto __first = ranges::begin(__rg);
1056 const auto __last = ranges::end(__rg);
1057 for (; __first != __last; ++__first)
1058 emplace_back(*__first);
1063 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1065 begin() _GLIBCXX_NOEXCEPT
1066 {
return iterator(this->_M_impl._M_start._M_p, 0); }
1068 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1070 begin()
const _GLIBCXX_NOEXCEPT
1071 {
return const_iterator(this->_M_impl._M_start._M_p, 0); }
1073 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1075 end() _GLIBCXX_NOEXCEPT
1076 {
return this->_M_impl._M_finish; }
1078 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1080 end()
const _GLIBCXX_NOEXCEPT
1081 {
return this->_M_impl._M_finish; }
1083 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1085 rbegin() _GLIBCXX_NOEXCEPT
1086 {
return reverse_iterator(
end()); }
1088 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1089 const_reverse_iterator
1090 rbegin()
const _GLIBCXX_NOEXCEPT
1091 {
return const_reverse_iterator(
end()); }
1093 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1095 rend() _GLIBCXX_NOEXCEPT
1096 {
return reverse_iterator(
begin()); }
1098 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1099 const_reverse_iterator
1100 rend()
const _GLIBCXX_NOEXCEPT
1101 {
return const_reverse_iterator(
begin()); }
1103#if __cplusplus >= 201103L
1104 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1107 {
return const_iterator(this->_M_impl._M_start._M_p, 0); }
1109 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1111 cend()
const noexcept
1112 {
return this->_M_impl._M_finish; }
1114 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1115 const_reverse_iterator
1117 {
return const_reverse_iterator(
end()); }
1119 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1120 const_reverse_iterator
1121 crend()
const noexcept
1122 {
return const_reverse_iterator(
begin()); }
1125 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1127 size()
const _GLIBCXX_NOEXCEPT
1128 {
return size_type(
end() -
begin()); }
1130 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1134 const size_type __isize =
1135 __gnu_cxx::__numeric_traits<difference_type>::__max
1136 - int(_S_word_bit) + 1;
1137 const size_type __asize
1139 return (__asize <= __isize /
int(_S_word_bit)
1140 ? __asize *
int(_S_word_bit) : __isize);
1143 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1146 {
return size_type(const_iterator(this->_M_impl._M_end_addr(), 0)
1149 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1151 empty()
const _GLIBCXX_NOEXCEPT
1154 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1158 __glibcxx_requires_subscript(__n);
1159 return _Bit_reference (this->_M_impl._M_start._M_p
1160 + __n /
int(_S_word_bit),
1161 1UL << __n %
int(_S_word_bit));
1164 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1168 __glibcxx_requires_subscript(__n);
1169 return _Bit_reference (this->_M_impl._M_start._M_p
1170 + __n /
int(_S_word_bit),
1171 1UL << __n %
int(_S_word_bit));
1175 _GLIBCXX20_CONSTEXPR
1179 if (__n >= this->
size())
1180 __throw_out_of_range_fmt(__N(
"vector<bool>::_M_range_check: __n "
1181 "(which is %zu) >= this->size() "
1187 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1192 return (*
this)[__n];
1195 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1197 at(size_type __n)
const
1200 return (*
this)[__n];
1203 _GLIBCXX20_CONSTEXPR
1208 __throw_length_error(__N(
"vector::reserve"));
1213 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1217 __glibcxx_requires_nonempty();
1221 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1225 __glibcxx_requires_nonempty();
1229 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1233 __glibcxx_requires_nonempty();
1234 return *(
end() - 1);
1237 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1241 __glibcxx_requires_nonempty();
1242 return *(
end() - 1);
1245 _GLIBCXX20_CONSTEXPR
1249 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
1250 *this->_M_impl._M_finish++ = __x;
1252 _M_insert_aux(
end(), __x);
1255 _GLIBCXX20_CONSTEXPR
1257 swap(vector& __x) _GLIBCXX_NOEXCEPT
1259#if __cplusplus >= 201103L
1260 __glibcxx_assert(_Bit_alloc_traits::propagate_on_container_swap::value
1261 || _M_get_Bit_allocator() == __x._M_get_Bit_allocator());
1263 this->_M_impl._M_swap_data(__x._M_impl);
1264 _Bit_alloc_traits::_S_on_swap(_M_get_Bit_allocator(),
1265 __x._M_get_Bit_allocator());
1269 _GLIBCXX20_CONSTEXPR
1271 swap(reference __x, reference __y) _GLIBCXX_NOEXCEPT
1278 _GLIBCXX20_CONSTEXPR
1280#if __cplusplus >= 201103L
1281 insert(const_iterator __position,
const bool& __x)
1283 insert(iterator __position,
const bool& __x)
1286 const difference_type __n = __position -
begin();
1287 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr()
1288 && __position == end())
1289 *this->_M_impl._M_finish++ = __x;
1291 _M_insert_aux(__position._M_const_cast(), __x);
1292 return begin() + __n;
1295#if _GLIBCXX_USE_DEPRECATED
1296 _GLIBCXX_DEPRECATED_SUGGEST(
"insert(position, false)")
1298 insert(const_iterator __position)
1299 {
return this->
insert(__position._M_const_cast(),
false); }
1302#if __cplusplus >= 201103L
1303 template<
typename _InputIterator,
1304 typename = std::_RequireInputIter<_InputIterator>>
1305 _GLIBCXX20_CONSTEXPR
1307 insert(const_iterator __position,
1308 _InputIterator __first, _InputIterator __last)
1310 difference_type __offset = __position -
cbegin();
1311 _M_insert_range(__position._M_const_cast(),
1314 return begin() + __offset;
1317 template<
typename _InputIterator>
1319 insert(iterator __position,
1320 _InputIterator __first, _InputIterator __last)
1323 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1324 _M_insert_dispatch(__position, __first, __last, _Integral());
1328#if __cplusplus >= 201103L
1329 _GLIBCXX20_CONSTEXPR
1331 insert(const_iterator __position, size_type __n,
const bool& __x)
1333 difference_type __offset = __position -
cbegin();
1334 _M_fill_insert(__position._M_const_cast(), __n, __x);
1335 return begin() + __offset;
1339 insert(iterator __position, size_type __n,
const bool& __x)
1340 { _M_fill_insert(__position, __n, __x); }
1343#if __cplusplus >= 201103L
1344 _GLIBCXX20_CONSTEXPR
1347 {
return this->
insert(__p, __l.begin(), __l.end()); }
1350#if __glibcxx_containers_ranges
1359 template<__detail::__container_compatible_range<
bool> _Rg>
1361 insert_range(const_iterator __pos, _Rg&& __rg)
1363 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
1365 if (
auto __n = size_type(ranges::distance(__rg)))
1369 std::copy_backward(__pos._M_const_cast(), end(),
1370 this->_M_impl._M_finish
1371 + difference_type(__n));
1372 ranges::copy(__rg, __pos._M_const_cast());
1373 this->_M_impl._M_finish += difference_type(__n);
1374 return __pos._M_const_cast();
1378 const size_type __len =
1379 _M_check_len(__n,
"vector<bool>::insert_range");
1380 const iterator __begin =
begin(), __end =
end();
1381 _Bit_pointer __q = this->_M_allocate(__len);
1383 iterator __i = _M_copy_aligned(__begin,
1384 __pos._M_const_cast(),
1386 iterator __j = ranges::copy(__rg, __i).out;
1387 iterator __finish = std::copy(__pos._M_const_cast(),
1389 this->_M_deallocate();
1390 this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
1391 this->_M_impl._M_start = __start;
1392 this->_M_impl._M_finish = __finish;
1397 return __pos._M_const_cast();
1400 return insert_range(__pos,
1408 template<__detail::__container_compatible_range<
bool> _Rg>
1410 append_range(_Rg&& __rg)
1415 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
1417 const auto __n = size_type(ranges::distance(__rg));
1424 const auto __sz =
size();
1425 const auto __capacity =
capacity();
1426 if ((__capacity - __sz) >= __n)
1428 this->_M_impl._M_finish
1434 __tmp.
reserve(_M_check_len(__n,
"vector::append_range"));
1435 __tmp._M_impl._M_finish
1437 __tmp._M_impl._M_finish
1443 auto __first = ranges::begin(__rg);
1444 const auto __last = ranges::end(__rg);
1448 __first != __last && __free > 0;
1449 ++__first, (void) --__free)
1450 emplace_back(*__first);
1452 if (__first == __last)
1463 _GLIBCXX20_CONSTEXPR
1466 { --this->_M_impl._M_finish; }
1468 _GLIBCXX20_CONSTEXPR
1470#if __cplusplus >= 201103L
1471 erase(const_iterator __position)
1473 erase(iterator __position)
1475 {
return _M_erase(__position._M_const_cast()); }
1477 _GLIBCXX20_CONSTEXPR
1479#if __cplusplus >= 201103L
1480 erase(const_iterator __first, const_iterator __last)
1482 erase(iterator __first, iterator __last)
1484 {
return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
1486 _GLIBCXX20_CONSTEXPR
1488 resize(size_type __new_size,
bool __x =
bool())
1490 if (__new_size <
size())
1491 _M_erase_at_end(
begin() + difference_type(__new_size));
1496#if __cplusplus >= 201103L
1497 _GLIBCXX20_CONSTEXPR
1500 { _M_shrink_to_fit(); }
1503 _GLIBCXX20_CONSTEXPR
1505 flip() _GLIBCXX_NOEXCEPT
1507 _Bit_type *
const __end = this->_M_impl._M_end_addr();
1508 for (_Bit_type * __p = this->_M_impl._M_start._M_p; __p != __end; ++__p)
1512 _GLIBCXX20_CONSTEXPR
1514 clear() _GLIBCXX_NOEXCEPT
1515 { _M_erase_at_end(
begin()); }
1517#if __cplusplus >= 201103L
1518 template<
typename... _Args>
1519#if __cplusplus > 201402L
1520 _GLIBCXX20_CONSTEXPR
1525 emplace_back(_Args&&... __args)
1528#if __cplusplus > 201402L
1533 template<
typename... _Args>
1534 _GLIBCXX20_CONSTEXPR
1536 emplace(const_iterator __pos, _Args&&... __args)
1542 _GLIBCXX20_CONSTEXPR
1544 _M_copy_aligned(const_iterator __first, const_iterator __last,
1547 _Bit_type* __q = std::copy(__first._M_p, __last._M_p, __result._M_p);
1548 return std::copy(const_iterator(__last._M_p, 0), __last,
1552 _GLIBCXX20_CONSTEXPR
1554 _M_initialize(size_type __n)
1558 _Bit_pointer __q = this->_M_allocate(__n);
1559 this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
1561 this->_M_impl._M_start = __start;
1562 this->_M_impl._M_finish = __start + difference_type(__n);
1566 _GLIBCXX20_CONSTEXPR
1568 _M_initialize_value(
bool __x) _GLIBCXX_NOEXCEPT
1570 if (_Bit_type* __p = this->_M_impl._M_start._M_p)
1571 __fill_bvector_n(__p, this->_M_impl._M_end_addr() - __p, __x);
1574 _GLIBCXX20_CONSTEXPR
1576 _M_reallocate(size_type __n);
1578#if __cplusplus >= 201103L
1579 _GLIBCXX20_CONSTEXPR
1584#if __cplusplus < 201103L
1587 template<
typename _Integer>
1589 _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
1591 _M_initialize(
static_cast<size_type
>(__n));
1592 _M_initialize_value(__x);
1595 template<
typename _InputIterator>
1597 _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1599 { _M_initialize_range(__first, __last,
1603 template<
typename _InputIterator>
1604 _GLIBCXX20_CONSTEXPR
1606 _M_initialize_range(_InputIterator __first, _InputIterator __last,
1609 for (; __first != __last; ++__first)
1613 template<
typename _ForwardIterator>
1614 _GLIBCXX20_CONSTEXPR
1616 _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
1621 std::copy(__first, __last,
begin());
1624#if __cplusplus < 201103L
1627 template<
typename _Integer>
1629 _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1630 { _M_fill_assign(__n, __val); }
1632 template<
class _InputIterator>
1634 _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1639 _GLIBCXX20_CONSTEXPR
1641 _M_fill_assign(
size_t __n,
bool __x)
1645 _M_initialize_value(__x);
1650 _M_erase_at_end(
begin() + __n);
1651 _M_initialize_value(__x);
1655 template<
typename _InputIterator>
1656 _GLIBCXX20_CONSTEXPR
1658 _M_assign_aux(_InputIterator __first, _InputIterator __last,
1661 iterator __cur =
begin();
1662 for (; __first != __last && __cur !=
end(); ++__cur, (void)++__first)
1664 if (__first == __last)
1665 _M_erase_at_end(__cur);
1670 template<
typename _ForwardIterator>
1671 _GLIBCXX20_CONSTEXPR
1673 _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1678 _M_erase_at_end(std::copy(__first, __last,
begin()));
1681 _ForwardIterator __mid = __first;
1683 std::copy(__first, __mid,
begin());
1688#if __cplusplus < 201103L
1691 template<
typename _Integer>
1693 _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
1695 { _M_fill_insert(__pos, __n, __x); }
1697 template<
typename _InputIterator>
1699 _M_insert_dispatch(iterator __pos,
1700 _InputIterator __first, _InputIterator __last,
1702 { _M_insert_range(__pos, __first, __last,
1706 _GLIBCXX20_CONSTEXPR
1708 _M_fill_insert(iterator __position, size_type __n,
bool __x);
1710 template<
typename _InputIterator>
1711 _GLIBCXX20_CONSTEXPR
1713 _M_insert_range(iterator __pos, _InputIterator __first,
1716 for (; __first != __last; ++__first)
1718 __pos =
insert(__pos, *__first);
1723 template<
typename _ForwardIterator>
1724 _GLIBCXX20_CONSTEXPR
1726 _M_insert_range(iterator __position, _ForwardIterator __first,
1729 _GLIBCXX20_CONSTEXPR
1731 _M_insert_aux(iterator __position,
bool __x);
1733 _GLIBCXX20_CONSTEXPR
1735 _M_check_len(size_type __n,
const char* __s)
const
1738 __throw_length_error(__N(__s));
1744 _GLIBCXX20_CONSTEXPR
1746 _M_erase_at_end(iterator __pos)
1747 { this->_M_impl._M_finish = __pos; }
1749 _GLIBCXX20_CONSTEXPR
1751 _M_erase(iterator __pos);
1753 _GLIBCXX20_CONSTEXPR
1755 _M_erase(iterator __first, iterator __last);
1763#if __cplusplus >= 201103L
1764 void data() =
delete;