TinySTL 文档 1.0
TinySTL
Container
vector
模板参数:
1 | tmplate <class T> |
T: 数据类型
内部类型表示:
typedef mystl::allocator<T> allocator_type;分配器类型typedef mystl::allocator<T> data_allocator;分配数据内存类型typedef typename allocator_type::value_type value_type;内部数据类型typedef typename allocator_type::pointer pointer;内部指针类型, 下面的引用类似typedef typename allocator_type::const_pointer const_pointer;typedef typename allocator_type::reference reference;typedef typename allocator_type::const_reference const_reference;typedef typename allocator_type::size_type size_type;容量类型typedef typename allocator_type::difference_type difference_type;两个迭代器之间的距离typedef value_type* iterator;迭代器类型typedef const value_type* const_iterator;typedef mystl::reverse_iterator<iterator> reverse_iterator;反向迭代器typedef mystl::reverse_iterator<const_iterator> const_reverse_iterator;
1 | T* start; // vector 的第一个元素的位置 |
方法关系图:
[
辅助函数
1
void insert_aux(iterator position, const T& value);
- position: 插入的位置
- value: 插入的值
内部调用:
clear()
对插入的数据进行内部调整, 如果剩余容量可以插入, 就直接插入, 反之则重新进行空间分配后再插入元素
1
2template<class ...Args>
void insert_aux(iterator position, Args&& ...args);模板参数:
- …Args: 要传入的数据列表
方法参数:
- position: 要插入的位置
- args: 传入的参数列表的右值引用
对插入的数据进行内部调整, 如果剩余容量可以插入, 就直接插入, 反之则重新进行空间分配后再插入元素, 且元素为右值, 用于插入右值时使用
内部调用:
clear()
1
void deallocate();
释放
vector管理的内存1
void fill_initialize(size_type n, const T& value);
n: 给
vector初始化的大小value:
vector中元素的初始值
内部调用:
- 将
1
void space_initialize(size_type size, size_type cap)
vector的空间初始化为n, 且所有元素的值都是value
- 模板参数:
1
2template <class Iter>
void range_initialize(Iter first, Iter last);- Iter: 需要一个迭代器
- first: 区间起始位置
- last: 区间最后位置的下一个位置
- 接受两个迭代器并将 $[first, last)$ 中的内容作为
1
void space_initialize(size_type size, size_type cap)
vector的初始内容, 此时 vector 的大小为distance(first, last)
1
void try_init() noexcept;
给
vector分配默认大小, 当前设置默认大小为 16, 且内部没有元素保证不抛出异常
1
void space_initialize(size_type size, size_type cap)
- size: 要给
vector初始化的大小 - cap: 给
vector初始化时设置的最大容量
使
vector留出 size 大小, 同时容量为 cap- size: 要给
构造函数
默认构造:
vector()内部调用try_init()来为vector分配初始大小有参构造 1:
explicit vector(size_type n)n :
vector的大小, 容器内的元素都将初始化为value_type的默认值**(有构造函数则调用 T 的默认构造)**explicit: 防止出现隐式转换为
vector
有参构造 2:
vector(size_type n, const T& value)n: 同 1
value:
vector中元素的初始值
内部调用:
fill_initialize(n, value)有参构造 3:
1
2
3template <class Iter, typename std::enable_if<
mystl::is_input_iterator<Iter>::value, int>::type = 0>
vector(Iter first, Iter last)模板参数:
Iter: 接收的迭代器类型
第二个模板参数则是进行判断是否为
input_iterator, 若不是则该方法失效
方法参数:
first: 区间起始位置的迭代器
last: 为区间结束位置的下一位置迭代器, 且该位置为开区间
内部调用:
range_initialize(first, last)初始化列表构造函数:
1
vector(std::initializer_list<T> ilist) { ... }
- ilist: 初始化列表
内部调用:
1
2template <class Iter>
range_initialize(Iter first, Iter last)
复制构造函数:
vector(const vector<T>& other)- other: 要复制的
vecotr<T>对象引用
内部调用:
range_initialize(other.begin(), other.end())- other: 要复制的
1 | vector(vector<T>&& other) |
- other: 要复制的
vector的右值引用
保证不抛出异常
析构函数
1 | ~vector() |
将 vector 内部元素全部析构, 再将 vector 内部空间释放
内部调用:
1 | deallocate() |
获取容器信息:
iterator begin() noexcept
获取容器第一个元素位置, 并返回迭代器, 保证不抛出异常
const_iterator begin() const noexcept返回常量迭代器, 当 vector 对象是 const 时会被调用, 其他同上
iterator end() noexcept返回
vector最后一个元素的后一个位置const_iterator end() const noexcept参考
begin()reverse_iterator rbegin() noexcept返回一个反向迭代器, 其本质指向
vector的end()保证不抛出异常const_reverse_iterator rbegin() const noexcept参考
begin()reverse_iterator rend() noexcept返回一个反向迭代器, 指本质向
vector的begin()保证不抛出异常const_reverse_iterator rend() const noexcept参考
begin()const_iterator cbegin() const noexcept返回
vector首部位置的迭代器, 且其是一个常量, 保证不抛出异常const_iterator cend() const noexcept参考
cbegin()const_reverse_iterator crbegin() const noexcept参考
cbegin()const_reverse_iterator crend() const noexcept参考
cbegin()bool empty() const noexcept判断
vector是否为空, 根据start是否和finish指向同一位置来判断vector是否为空. 保证不抛出异常size_type size() const noexcept返回
vector中元素个数. 保证不抛出异常size_type max_size() const noexceptvector可纳最大元素个数. 保证不抛出异常size_type capacity() const noexcept返回
vector容量. 保证不抛出异常void reserve(size_type n);- n: 要求重新分配的大小
内部调用:
clear()
重新分配 vector 容量, 且只有原容量小于要求大小时才会重新分配
reference at(size_type n)- n: 要获取的下标位置
获取指定下标处元素, 当指定下标超出有效范围后会抛出异常
const_reference at(size_type n) const效果同上, 返回的是常量引用, 作为
const vector对象调用时的版本reference front()获取第一个元素的引用
const_reference front() const参考
at(size_type n)reference back()获取最后一个元素的引用
const_reference back() const参考
at(size_type n)
修改容器相关
void fill_assign(size_type n, const T& value);- n: 向
vector中填充的元素个数 - value: 向
vector中填充的元素值
调用方法:
vector(size_type n, const T& value)iterator erase(const_iterator pos)
该方法会将
vector的size()修改为 $n$- n: 向
1
2template <class IIter>
void copy_assign(IIter first, IIter last, input_iterator_tag);模板参数:
- IIter: 接受的迭代器
方法参数:
- first: 区间左端点迭代器
- last: 区间右端点迭代器
- input_iterator_tag: 表明 IIter 是一个
input_iterator
内部调用:
iterator erase(const_iterator first, const_iterator last)iterator insert(const_iterator pos, const T& value)
使用 $[first, last)$ 中的元素填充
vector并将容量设置为distance(first, last), 该方法用于处理input_iterator类型迭代器, 其内部复制使用采用循环赋值的方式1
2template <class FIter>
void copy_assign(FIter first, FIter last, forward_iterator_tag);模板参数:
- FIter: 接受的前向迭代器
方法参数:
- first: 区间左端点迭代器
- last: 区间右端点迭代器
- forward_iterator_tag: 表明 FIter 是一个
forward_iterator
使用 $[first, last)$ 中的元素填充
vector并将容量设置为distance(first, last), 该方法用于处理forward_iterator类型迭代器, 其内部复制使用采用整体拷贝的方式, 来提升性能1
void assign(size_type n, const T& value)
方法参数:
- n: 向
vector中填充的元素个数 - value: 向
vector中填充的元素值
内部调用:
void fill_assign(size_type n, const T& value);
使用 $n$ 个值为
value的元素填充vector- n: 向
```c++
template <class Iter, typename std::enable_if<mystl::is_input_iterator<Iter>::value, int>::type = 0>void assign(Iter first, Iter last)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
**模板参数:**
- Iter: 接受的迭代器
- 第二参数来判断是否为 `input_iterator` 类型迭代器, 不是则该方法则失效
**方法参数:**
- first: 区间左端点迭代器
- last: 区间右端点迭代器
使用 $[first, last)$ 的元素来填充 `vector` , 并且将容量修改为 `distance(first, last)` 同时内部根据迭代器实际类型来实例化不同的处理方法, 来提高性能
**内部调用:**
```c++
copy_assign(first, last, iterator_category(first));
// 根据第三参数来选择调用1
2template <class IIter>
void copy_assign(IIter first, IIter last, input_iterator_tag);或
1
2template <class FIter>
void copy_assign(FIter first, FIter last, forward_iterator_tag);void assign(std::initializer_list<value_type> il)内部调用:
void copy_assign(FIter first, FIter last, forward_iterator_tag);
使用初始化链表来填充
vector1
2template <class... Args>
iterator emplace(const_iterator pos, Args&& ...args);方法参数:
- pos: 要插入元素的位置
- …args: 要插入的参数包的右值引用
将参数包的第一个参数在
pos位置处就地构造元素, 避免额外的复制或者移动开销内部调用:
当需要扩容时调用
1
2template <class ...Args>
void insert_aux(iterator position, Args&& ...args)
1
2template <class... Args>
void emplace_back(Args&& ...args);方法参数:
- …args: 要插入的参数包的右值引用
内部调用:
当需要扩容时调用
1
2template <class T>
void insert_aux(iterator position, const T& value)
将参数包的第一个参数在
end()位置处就地构造元素, 避免额外的复制或者移动开销void push_back(const T& value)方法参数:
- value: 要放入
vector中的值引用
内部调用:
void insert_aux(iterator position, const T& value);
向
vector最后加入元素- value: 要放入
void push_back(T&& value)方法参数:
- value: 要插入的元素的右值引用
内部调用:
1
2template <class... Args>
void emplace_back(Args&& ...args);作用同上, 只是这里传入的右值引用
void pop_back()删除最后一个元素
1
2template<class Iter>
void range_insert(const_iterator position, Iter first, Iter last);模板参数:
- Iter: 接受的迭代器
方法参数:
position: 要插入的位置
first: 区间左端点迭代器
last: 区间右端点迭代器
在 position 处插入 $[first, last)$ 区间内的元素
iterator insert(const_iterator pos, const T& value)方法参数:
- pos: 要插入的位置
- value: 要插入元素的值
内部调用:
void insert_aux(iterator position, const T& value);
在 pos 处插入值为
value的元素iterator insert(const_iterator pos, T&& value)方法参数:
- pos: 要插入元素的位置
- value: 要插入元素的值
内部调用:
1
2template <class... Args>
iterator emplace(const_iterator pos, Args&& ...args);将元素值为
value插入vector的pos处iterator insert(const_iterator pos)方法参数:
- pos: 要插入的位置
内部调用:
iterator insert(const_iterator pos, T&& value)
在
pos插入一个该类型的默认值void insert(const_iterator pos, size_type n, const T& value);方法参数:
- pos: 要插入的位置
- n: 要插入的元素的数量
- value: 要插入元素的值
在
pos处插入 $n$ 个值为value的元素1
2
3template <class Iter, typename std::enable_if<
mystl::is_input_iterator<Iter>::value, int>::type = 0>
void insert(const_iterator pos, Iter first, Iter last)模板参数:
- Iter: 接受的迭代器
- 第二参数来判断是否为
input_iterator类型迭代器, 不是则该方法则失效
方法参数:
- pos: 要插入的位置
- first: 要插入区间的左端点
- last: 要插入区间的右端点
内部调用:
1
2template<class Iter>
void range_insert(const_iterator position, Iter first, Iter last);将 $[first, last)$ 的元素值插入到
pos位置iterator erase(const_iterator pos);方法参数:
- pos: 要删除元素的位置
删除
pos位置的元素iterator erase(const_iterator first, const_iterator last);方法参数:
- first: 要删除区间的左端点
- last: 要删除区间的右端点
删除区间 $[first, last)$ 内的元素
void swap(vector<T>& other) noexcept;方法参数:
- other: 要与当前对象交换的对象
交换两个
vector该方法不会抛出异常.void clear();清空
vector只是析构掉储存的元素, 并不释放空间void reverse()内部调用:
std::reverse(first, last)
此部分暂时通过调用
std::reverse实现, 反转vector元素void resize(size_type new_size, const T& value);方法参数:
- new_size: 设置的
vector存储元素的大小 - value: 重新设置大小后元素的值
内部调用:
iterator erase(const_iterator first, const_iterator last);void insert(const_iterator pos, size_type n, const T& value);
将
vector的元素数量重置为new_size且元素值为value- new_size: 设置的
void resize(size_type new_size)方法参数:
- new_size: 设置的
vector存储元素的大小
内部调用:
void resize(size_type new_size, const T& value);
将
vector的元素数量重置为new_size且元素值为默认值- new_size: 设置的
重载运算符
赋值运算符:
左值引用版本
vector<T>& operator=(const vector<T>& rhs);内部调用:
1
2
3template <class Iter, typename std::enable_if<
mystl::is_input_iterator<Iter>::value, int>::type = 0>
vector(Iter first, Iter last)右值引用版本
vector<T>& operator=(vector<T>&& rhs)内部调用:
clear()
保证不抛出异常
初始化列表版本
vector<T>& operator=(std::initializer_list<T> ilist)内部调用:
vector(std::initializer_list<T> ilist) { ... }
重载 [] 运算符:
reference operator[](size_type n)取出下标为 $n$ 的元素
const_reference operator[](size_type n) const同上, 当对象为常对象时优先调用
