1#ifndef NEFORCE_CORE_CONTAINER_VECTOR_HPP__
2#define NEFORCE_CORE_CONTAINER_VECTOR_HPP__
15NEFORCE_BEGIN_NAMESPACE__
31template <
bool IsConst,
typename Vector>
32struct vector_iterator :
iiterator<vector_iterator<IsConst, Vector>> {
36 using size_type =
typename container_type::size_type;
40 typename container_type::reference>;
42 typename container_type::pointer>;
49 NEFORCE_CONSTEXPR20 vector_iterator() noexcept = default;
50 NEFORCE_CONSTEXPR20 ~vector_iterator() = default;
52 NEFORCE_CONSTEXPR20 vector_iterator(const vector_iterator&) noexcept = default;
53 NEFORCE_CONSTEXPR20 vector_iterator& operator=(const vector_iterator&) noexcept = default;
54 NEFORCE_CONSTEXPR20 vector_iterator(vector_iterator&&) noexcept = default;
55 NEFORCE_CONSTEXPR20 vector_iterator& operator=(vector_iterator&&) noexcept = default;
73 "Attempting to dereference out of boundary");
100 NEFORCE_DEBUG_VERIFY((current_ && container_) || off == 0,
"Attempting to advance a null pointer");
101 NEFORCE_DEBUG_VERIFY((off < 0 ? off >= container_->start_ - current_ : off <= container_->finish_ - current_),
102 "Attempting to advance out of boundary");
112 NEFORCE_DEBUG_VERIFY(container_ == other.container_,
"Attempting to distance to a different container");
128 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
bool equal(
const vector_iterator& rhs)
const noexcept {
129 NEFORCE_DEBUG_VERIFY(container_ == rhs.container_,
"Attempting to equal to a different container");
130 return current_ == rhs.current_;
138 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
bool less_than(
const vector_iterator& rhs)
const noexcept {
139 NEFORCE_DEBUG_VERIFY(container_ == rhs.container_,
"Attempting to less than a different container");
140 return current_ < rhs.current_;
147 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
pointer base() const noexcept {
return current_; }
166template <
typename T,
typename Alloc = allocator<T>>
168 static_assert(
is_object_v<T>,
"vector only contains object types.");
180 using iterator = vector_iterator<false, vector<T, Alloc>>;
192 template <
bool,
typename>
205 NEFORCE_CONSTEXPR20
void fill_initialize(
size_type n,
const T& value) {
206 start_ = pair_.get_base().allocate(n);
208 finish_ = start_ + n;
209 pair_.value = finish_;
220 template <
typename Iterator>
221 NEFORCE_CONSTEXPR20
pointer allocate_and_copy(
size_type n, Iterator first, Iterator last) {
228 _NEFORCE
destroy(result, finish);
229 pair_.get_base().deallocate(result, n);
243 template <
typename Iterator>
244 NEFORCE_CONSTEXPR20
pointer allocate_and_move(
size_type n, Iterator first, Iterator last) {
245 pointer result = pair_.get_base().allocate(n);
250 _NEFORCE
destroy(result, finish);
251 pair_.get_base().deallocate(result, n);
263 template <
typename Iterator>
265 for (; first != last; ++first) {
277 template <
typename Iterator>
280 start_ = vector::allocate_and_copy(n, first, last);
281 finish_ = start_ + n;
282 pair_.value = finish_;
289 NEFORCE_CONSTEXPR20
void deallocate() noexcept {
291 pair_.get_base().deallocate(start_, pair_.value - start_);
302 template <
typename Iterator>
305 while (first != last) {
320 template <
typename Iterator>
327 const size_t n = _NEFORCE
distance(first, last);
329 if (
static_cast<size_t>(pair_.value - finish_) >= n) {
330 const size_t elems_after =
end() - position;
333 if (elems_after > n) {
336 _NEFORCE
copy_backward(position, old_finish - n, old_finish);
337 _NEFORCE
copy(first, last, position);
339 Iterator mid = first;
340 _NEFORCE
advance(mid, elems_after);
342 finish_ += (n - elems_after);
344 finish_ += elems_after;
345 _NEFORCE
copy(first, mid, position);
349 const size_type len = old_size + _NEFORCE
max(old_size, n);
350 pointer new_start = pair_.get_base().allocate(len);
351 pointer new_finish = new_start;
357 _NEFORCE
destroy(start_, finish_);
361 finish_ = new_finish;
362 pair_.value = new_start + len;
373 template <
typename Iterator>
376 while (first != last) {
389 template <
typename Iterator>
391 const size_t n = _NEFORCE
distance(first, last);
393 pointer new_start = vector::allocate_and_copy(n, first, last);
394 _NEFORCE
destroy(start_, finish_);
397 finish_ = start_ + n;
398 pair_.value = start_ + n;
399 }
else if (n >
size()) {
400 Iterator mid = first;
402 _NEFORCE
copy(first, mid, start_);
405 _NEFORCE
copy(first, last, start_);
419 pointer result = pair_.get_base().allocate(init_cap);
420 finish_ = start_ = result;
421 pair_.value = finish_ + init_cap;
429 start_ = pair_.get_base().allocate(n);
437 _NEFORCE
destroy(start_, finish_);
438 pair_.get_base().deallocate(start_, n);
441 pair_.value = start_ + n;
449 NEFORCE_CONSTEXPR20
explicit vector(
const size_type n,
const T& value) { vector::fill_initialize(n, value); }
456 NEFORCE_CONSTEXPR20
explicit vector(
const int32_t n,
const T& value) { vector::fill_initialize(n, value); }
463 NEFORCE_CONSTEXPR20
explicit vector(
const int64_t n,
const T& value) { vector::fill_initialize(n, value); }
471 start_ = vector::allocate_and_copy(n, other.
begin(), other.
end());
472 finish_ = start_ + n;
473 pair_.value = finish_;
505 NEFORCE_CONSTEXPR20
vector&
523 template <
typename Iterator, enable_if_t<is_ranges_iter_v<Iterator>,
int> = 0>
524 NEFORCE_CONSTEXPR20
vector(Iterator first, Iterator last) {
526 vector::range_initialize(first, last);
535 template <
typename Iterator>
537 vector(first, first + n) {}
543 NEFORCE_CONSTEXPR20
vector(std::initializer_list<T> ilist) :
560 pointer new_ = vector::allocate_and_move(ilist.end() - ilist.begin(), ilist.begin(), ilist.end());
561 _NEFORCE
destroy(start_, finish_);
564 finish_ = start_ + ilist.size();
565 pair_.value = start_ + ilist.size();
566 }
else if (
size() >= ilist.size()) {
570 _NEFORCE
copy(ilist.begin(), ilist.begin() +
size(), start_);
573 finish_ = start_ + ilist.
size();
668 return static_cast<size_type>(finish_ - start_);
682 return static_cast<size_type>(pair_.value - start_);
689 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
bool empty() const noexcept {
return start_ == finish_; }
715 return {start_,
size()};
724 return {start_,
size()};
734 return {start_ + off,
count};
745 return {start_ + off,
count};
772 return *(finish_ - 1);
781 return *(finish_ - 1);
797 pointer new_start = pair_.get_base().allocate(new_capacity);
798 pointer new_finish = new_start;
803 _NEFORCE
destroy(new_start, new_finish);
804 pair_.get_base().deallocate(new_start, new_capacity);
808 _NEFORCE
destroy(start_, finish_);
811 finish_ = new_finish;
812 pair_.value = start_ + new_capacity;
824 if (new_size <
size()) {
843 template <
typename... Args>
845 if (finish_ != pair_.value) {
846 if (position ==
end()) {
860 const size_type new_cap = old_size != 0 ? 2 * old_size : 1;
861 pointer new_start = pair_.get_base().allocate(new_cap);
862 pointer new_finish = new_start;
870 _NEFORCE
destroy(new_start, new_finish);
871 pair_.get_base().deallocate(new_start, new_cap);
879 finish_ = new_finish;
880 pair_.value = new_start + new_cap;
888 template <
typename... Args>
890 if (finish_ != pair_.value) {
925 T value{_NEFORCE
move(finish_ - 1)};
928 return _NEFORCE
move(value);
938 pointer new_start = pair_.get_base().allocate(n);
939 pointer new_finish = new_start;
944 _NEFORCE
destroy(new_start, new_finish);
945 pair_.get_base().deallocate(new_start, n);
949 _NEFORCE
destroy(start_, finish_);
953 finish_ = new_finish;
954 pair_.value = start_ + n;
955 }
else if (n >
size()) {
970 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
971 NEFORCE_CONSTEXPR20
void assign(Iterator first, Iterator last) {
972 vector::assign_aux(first, last);
979 NEFORCE_CONSTEXPR20
void assign(std::initializer_list<value_type> ilist) {
1021 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
1023 vector::range_insert(position, first, last);
1031 NEFORCE_CONSTEXPR20
void insert(
iterator position, std::initializer_list<value_type> ilist) {
1046 if (
static_cast<size_type>(pair_.value - finish_) >= n) {
1050 if (elems_after > n) {
1053 _NEFORCE
copy_backward(position, old_finish - n, old_finish);
1054 _NEFORCE
fill(position, position + n, value);
1057 finish_ += n - elems_after;
1059 finish_ += elems_after;
1060 _NEFORCE
destroy(position, old_finish);
1065 const size_type len = old_size + _NEFORCE
max(old_size, n);
1067 pointer new_start = pair_.get_base().allocate(len);
1072 _NEFORCE
destroy(start_, finish_);
1076 finish_ = new_finish;
1077 pair_.value = new_start + len;
1092 const auto elems_after =
end() - last;
1093 if (elems_after > 0) {
1097 pointer new_finish = finish_ - (last - first);
1098 _NEFORCE
destroy(new_finish, finish_);
1099 finish_ = new_finish;
1109 if (position + 1 !=
end()) {
1110 _NEFORCE
move(position + 1,
end(), position);
1130 start_ = finish_ = pair_.value =
nullptr;
1134 pointer new_start = pair_.get_base().allocate(
size());
1135 pointer new_finish = new_start;
1140 _NEFORCE
destroy(new_start, new_finish);
1141 pair_.get_base().deallocate(new_start,
size());
1145 _NEFORCE
destroy(start_, finish_);
1149 finish_ = new_finish;
1150 pair_.value = new_start +
size();
1163 _NEFORCE
destroy(start_, finish_);
1174 return *(start_ + position);
1184 return *(start_ + position);
1193 return at(position);
1202 return at(position);
1210 if (_NEFORCE
addressof(other) ==
this) {
1214 _NEFORCE
swap(start_, other.start_);
1215 _NEFORCE
swap(finish_, other.finish_);
1216 _NEFORCE
swap(pair_, other.pair_);
1240#ifdef NEFORCE_STANDARD_17
1241template <
typename T,
typename Alloc>
1244template <
typename Iterator,
typename Alloc>
1255NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference front() noexcept
访问第一个元素
NEFORCE_CONSTEXPR20 void clear() noexcept(is_nothrow_destructible_v< value_type >)
清空向量
NEFORCE_CONSTEXPR20 void assign(std::initializer_list< value_type > ilist)
初始化列表赋值
_NEFORCE reverse_iterator< const_iterator > const_reverse_iterator
常量反向迭代器类型
NEFORCE_CONSTEXPR20 void push_back(const T &value)
在末尾拷贝插入元素
NEFORCE_CONSTEXPR20 vector(const int64_t n, const T &value)
构造包含n个指定值元素的向量
NEFORCE_CONSTEXPR20 void shrink_to_fit()
收缩容量以适应当前大小
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reverse_iterator rend() noexcept
获取反向结束迭代器
NEFORCE_CONSTEXPR20 vector & operator=(const vector &other)
拷贝赋值运算符
NEFORCE_CONSTEXPR20 vector & operator=(vector &&other) noexcept(is_nothrow_destructible_v< value_type > &&is_nothrow_swappable_v< compressed_pair< allocator_type, pointer > >)
移动赋值运算符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_iterator begin() const noexcept
获取常量起始迭代器
NEFORCE_CONSTEXPR20 iterator insert(iterator position, const value_type &value)
在指定位置拷贝插入元素
NEFORCE_CONSTEXPR20 vector(std::initializer_list< T > ilist)
初始化列表构造函数
NEFORCE_CONSTEXPR20 iterator insert(iterator position, value_type &&value)
在指定位置移动插入元素
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference at(const size_type position) noexcept
带边界检查的索引访问
NEFORCE_CONSTEXPR20 void resize(const size_type new_size)
使用默认构造的元素调整大小
NEFORCE_CONSTEXPR20 void insert(iterator position, size_type n, const value_type &value)
插入n个指定值的元素
const T & const_reference
常量引用类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 memory_view< byte_t > view() noexcept
NEFORCE_CONSTEXPR20 void pop_back() noexcept(is_nothrow_destructible_v< T >)
移除末尾元素
NEFORCE_CONSTEXPR20 vector(const vector &other)
拷贝构造函数
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 iterator end() noexcept
获取结束迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reference back() const noexcept
访问最后一个常量元素
Alloc allocator_type
分配器类型
const T * const_pointer
常量指针类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type capacity() const noexcept
获取当前容量
NEFORCE_CONSTEXPR20 void insert(iterator position, std::initializer_list< value_type > ilist)
初始化列表插入
NEFORCE_CONSTEXPR20 void swap(vector &other) noexcept(is_nothrow_swappable_v< allocator_type >)
交换两个向量的内容
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reverse_iterator rend() const noexcept
获取常量反向结束迭代器
NEFORCE_CONSTEXPR20 iterator erase(iterator position) noexcept(is_nothrow_move_assignable_v< value_type >)
删除指定位置的元素
NEFORCE_CONSTEXPR20 ~vector()
析构函数
NEFORCE_CONSTEXPR20 vector(Iterator first, Iterator last)
范围构造函数
NEFORCE_CONSTEXPR20 vector(const int32_t n, const T &value)
构造包含n个指定值元素的向量
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_pointer data() const noexcept
获取底层数据常量指针
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference back() noexcept
访问最后一个元素
NEFORCE_CONSTEXPR20 vector(Iterator first, const size_type n)
范围构造函数
vector_iterator< false, vector< T, Alloc > > iterator
迭代器类型
NEFORCE_CONSTEXPR20 void push_back(T &&value)
在末尾移动插入元素
NEFORCE_CONSTEXPR20 vector(vector &&other) noexcept(is_nothrow_swappable_v< compressed_pair< allocator_type, pointer > >)
移动构造函数
NEFORCE_CONSTEXPR20 vector & operator=(std::initializer_list< T > ilist)
初始化列表赋值运算符
NEFORCE_CONSTEXPR20 iterator erase(iterator first, iterator last) noexcept(is_nothrow_move_assignable_v< value_type > &&is_nothrow_destructible_v< value_type >)
删除指定范围内的元素
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_iterator end() const noexcept
获取常量结束迭代器
NEFORCE_CONSTEXPR20 vector(const size_type n, const T &value)
构造包含n个指定值元素的向量
NEFORCE_CONSTEXPR20 void reserve(const size_type n)
预留容量
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(const vector &rhs) const noexcept(noexcept(_NEFORCE lexicographical_compare(cbegin(), cend(), rhs.cbegin(), rhs.cend())))
小于比较操作符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 iterator begin() noexcept
获取起始迭代器
NEFORCE_CONSTEXPR20 void assign(Iterator first, Iterator last)
范围赋值
vector_iterator< true, vector< T, Alloc > > const_iterator
常量迭代器类型
_NEFORCE reverse_iterator< iterator > reverse_iterator
反向迭代器类型
NEFORCE_CONSTEXPR20 void assign(size_type n, const value_type &value)
赋值n个指定值的元素
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reference operator[](const size_type position) const noexcept
常量下标访问操作符
NEFORCE_CONSTEXPR20 vector(memory_view< T > view)
内存视图构造函数
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 memory_view< const T > view(const size_type off, size_type count=npos) const noexcept
获取底层数据的常量视图
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference operator[](const size_type position) noexcept
下标访问操作符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type size() const noexcept
获取当前元素数量
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 memory_view< const T > view() const noexcept
获取底层数据的常量视图
static NEFORCE_NODISCARD constexpr size_type max_size() noexcept
获取最大可能大小
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer data() noexcept
获取底层数据指针
NEFORCE_CONSTEXPR20 void insert(iterator position, Iterator first, Iterator last)
范围插入
NEFORCE_CONSTEXPR20 vector()
默认构造函数
NEFORCE_CONSTEXPR20 iterator insert(iterator position)
在指定位置插入默认构造的元素
NEFORCE_CONSTEXPR20 void emplace(iterator position, Args &&... args)
在指定位置构造元素
NEFORCE_CONSTEXPR20 T pop_back_v() noexcept(is_nothrow_destructible_v< T > &&is_nothrow_move_constructible_v< T >)
移除并返回末尾元素
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reverse_iterator rbegin() noexcept
获取反向起始迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_iterator cbegin() const noexcept
获取常量起始迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool empty() const noexcept
检查是否为空
NEFORCE_CONSTEXPR20 void emplace_back(Args &&... args)
在末尾构造元素
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reverse_iterator rbegin() const noexcept
获取常量反向起始迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
ptrdiff_t difference_type
差值类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(const vector &rhs) const noexcept(noexcept(_NEFORCE equal(cbegin(), cend(), rhs.cbegin())))
相等比较操作符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 memory_view< T > view(const size_type off, size_type count=npos) noexcept
获取底层数据的视图
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_iterator cend() const noexcept
获取常量结束迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reference front() const noexcept
访问第一个常量元素
NEFORCE_CONSTEXPR20 vector(const size_type n)
构造包含n个默认构造元素的向量
NEFORCE_CONSTEXPR20 void resize(size_type new_size, const T &value)
调整大小
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reference at(const size_type position) const noexcept
带边界检查的常量索引访问
static constexpr size_type npos
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_INLINE17 constexpr bool is_object_v
is_object的便捷变量模板
constexpr const T & max(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(a, b)))
返回两个值中的较大者
NEFORCE_NODISCARD constexpr bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2, BinaryPredicate binary_pred) noexcept(noexcept(++first1) &&noexcept(++first2) &&noexcept(binary_pred(*first1, *first2)))
比较两个范围是否相等
NEFORCE_NODISCARD constexpr bool lexicographical_compare(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Compare comp) noexcept(noexcept(++first1) &&noexcept(++first2) &&noexcept(comp(*first1, *first2)) &&noexcept(first1==last1 &&first2 !=last2))
字典序比较两个范围
constexpr const T & min(const T &a, const T &b, Compare comp) noexcept(noexcept(comp(b, a)))
返回两个值中的较小者
vector< byte_t > byte_vector
字节向量类型别名
long long int64_t
64位有符号整数类型
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
#define NEFORCE_DEBUG_VERIFY(CON, MESG)
调试模式断言
NEFORCE_CONSTEXPR20 T * construct(T *ptr, Args &&... args) noexcept(is_nothrow_constructible_v< T, Args... >)
在指定内存位置构造对象
NEFORCE_CONSTEXPR20 void destroy(T *pointer) noexcept(is_nothrow_destructible_v< T >)
销毁单个对象
constexpr void advance(Iterator &i, Distance n)
将迭代器前进指定距离
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
NEFORCE_CONSTEXPR20 void deallocate(void *ptr, inner::alloc_size_t bytes) noexcept
内存释放函数
constexpr void fill(Iterator first, Iterator last, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充范围元素
constexpr Iterator2 copy_backward(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__copy_backward_aux(first, last, result)))
反向复制范围元素
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr Iterator2 copy(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__copy_aux(first, last, result)))
复制范围元素
constexpr Iterator2 move_backward(Iterator1 first, Iterator1 last, Iterator2 result)
反向移动范围元素
constexpr Iterator fill_n(Iterator first, iter_difference_t< Iterator > n, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充指定数量的元素
void swap()=delete
删除无参数的swap重载
NEFORCE_INLINE17 constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_allocator_v
is_allocator的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_assignable_v
is_nothrow_move_assignable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_destructible_v
is_nothrow_destructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_same_v
is_same的便捷变量模板
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
NEFORCE_CONSTEXPR20 Iterator2 uninitialized_copy(Iterator1 first, Iterator1 last, Iterator2 result)
复制元素到未初始化内存
NEFORCE_CONSTEXPR20 void uninitialized_fill(Iterator first, Iterator last, const T &x)
在未初始化内存上填充值
NEFORCE_CONSTEXPR20 Iterator uninitialized_fill_n(Iterator first, size_t n, const T &x)
在未初始化内存中用指定值填充指定数量的元素
NEFORCE_CONSTEXPR20 Iterator2 uninitialized_move(Iterator1 first, Iterator1 last, Iterator2 result)
在未初始化内存中移动元素
constexpr compressed_pair & get_base() noexcept
获取基类引用
typename container_type::difference_type difference_type
差值类型
NEFORCE_CONSTEXPR20 void advance(difference_type off) noexcept
前进操作
NEFORCE_CONSTEXPR20 void increment() noexcept
递增操作
Vector container_type
容器类型
typename container_type::value_type value_type
值类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const container_type * container() const noexcept
获取关联容器
typename container_type::size_type size_type
大小类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool equal(const vector_iterator &rhs) const noexcept
相等比较
NEFORCE_CONSTEXPR20 void decrement() noexcept
递减操作
conditional_t< IsConst, typename container_type::const_reference, typename container_type::reference > reference
引用类型
contiguous_iterator_tag iterator_category
迭代器类别
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer base() const noexcept
获取底层指针
conditional_t< IsConst, typename container_type::const_pointer, typename container_type::pointer > pointer
指针类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference dereference() const noexcept
解引用操作
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool less_than(const vector_iterator &rhs) const noexcept
小于比较
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference operator[](difference_type off) noexcept
下标访问操作符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 difference_type distance_to(const vector_iterator &other) const noexcept
计算距离操作