前言
前面两节对deque
基本所有的操作都分析了, 本节就分析deque
的insert操作的实现. insert的重载函数有很多, 所以没有在上节一起分析, 本节也只是对部分重载函数进行分析, 剩下的列出源码就行了.
源码分析
insert实现
这里先将insert
的所有重载函数进行罗列.
iterator insert(iterator position, const value_type& x);
iterator insert(iterator position) ;
// 调用相同的重载函数
void insert(iterator pos, size_type n, const value_type& x);
void insert(iterator pos, int n, const value_type& x);
void insert(iterator pos, long n, const value_type& x);
void insert(iterator pos, InputIterator first, InputIterator last);
void insert(iterator pos, const value_type* first, const value_type* last);
void insert(iterator pos, const_iterator first, const_iterator last);
void insert(iterator pos, InputIterator first, InputIterator last, input_iterator_tag);
void insert(iterator pos, ForwardIterator first, ForwardIterator last,forward_iterator_tag);
iterator insert(iterator position, const value_type& x)
template <class T, class Alloc = alloc, size_t BufSiz = 0>
class deque {
...
public: // Insert
iterator insert(iterator position, const value_type& x) {
// 如果只是在头尾插入, 直接调用push就行了.
if (position.cur == start.cur) {
push_front(x);
return start;
}
else if (position.cur == finish.cur) {
push_back(x);
iterator tmp = finish;
--tmp;
return tmp;
}
// 随机插入
else {
return insert_aux(position, x);
}
}
};
**insert(iterator pos, size_type n, const value_type& x) ** 在指定的位置插入n个元素并初始化.
template <class T, class Alloc, size_t BufSize>
void deque<T, Alloc, BufSize>::insert(iterator pos, size_type n, const value_type& x)
{
// 同样判断是不是直接在头尾进行插入.
if (pos.cur == start.cur) {
// 判断还有没有足够的空间
iterator new_start = reserve_elements_at_front(n);
uninitialized_fill(new_start, start, x); // 范围初始化
start = new_start; // 修改start位置
}
else if (pos.cur == finish.cur) {
iterator new_finish = reserve_elements_at_back(n); // 判断还有没有足够的空间
uninitialized_fill(finish, new_finish, x); // 范围初始化
finish = new_finish; // 修改finish位置
}
// 随机插入
else
insert_aux(pos, n, x);
}
void insert(iterator pos, int n, const value_type& x) {
insert(pos, (size_type) n, x);
}
void insert(iterator pos, long n, const value_type& x) {
insert(pos, (size_type) n, x);
}
**void insert(iterator pos, InputIterator first, InputIterator last) **. 通过参数的类型选择最优, 高效率的插入方式.
template <class InputIterator>
void insert(iterator pos, InputIterator first, InputIterator last)
{
insert(pos, first, last, iterator_category(first));
}
// input_iterator_tag类型的迭代器
template <class T, class Alloc, size_t BufSize>
template <class InputIterator>
void deque<T, Alloc, BufSize>::insert(iterator pos,InputIterator first, InputIterator last,
input_iterator_tag)
{
copy(first