2024年最全C++标准库STL部分代码学习(源码之前,了无秘密),C C++面试相关文章及Github学习资料

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

// |

// --------------------------------------------------

// Yes | | No

// | |

// ↓ |

// construct(finish, *(finish - 1)); |

// ++finish; |

// T x_copy = x; |

// copy_backward(position, finish - 2, finish - 1); |

// *position = x_copy; |

// ↓

// data_allocator::allocate(len); <stl_alloc.h>

// uninitialized_copy(start, position, new_start); <stl_uninitialized.h>

// construct(new_finish, x); <stl_construct.h>

// ++new_finish;

// uninitialized_copy(position, finish, new_finish); <stl_uninitialized.h>

// destroy(begin(), end()); <stl_construct.h>

// deallocate();

iterator insert(iterator position, const T& x)

{

size_type n = position - begin();

if (finish != end_of_storage && position == end())

{

construct(finish, x);

++finish;

}

else

insert_aux(position, x);

return begin() + n;

}

iterator insert(iterator position) { return insert(position, T()); }

void pop_back()

{

–finish;

destroy(finish);

}

iterator erase(iterator position)

{

if (position + 1 != end())

copy(position + 1, finish, position);

–finish;

destroy(finish);

return position;

}

iterator erase(iterator first, iterator last)

{

iterator i = copy(last, finish, first);

// 析构掉需要析构的元素

destroy(i, finish);

finish = finish - (last - first);

return first;

}

// 调整size, 但是并不会重新分配内存空间

void resize(size_type new_size, const T& x)

{

if (new_size < size())

erase(begin() + new_size, end());

else

insert(end(), new_size - size(), x);

}

void resize(size_type new_size) { resize(new_size, T()); }

void clear() { erase(begin(), end()); }

protected:

// 分配空间, 并且复制对象到分配的空间处

iterator allocate_and_fill(size_type n, const T& x)

{

iterator result = data_allocator::allocate(n);

uninitialized_fill_n(result, n, x);

return result;

}

// 提供插入操作

// insert_aux(iterator position, const T& x)

// |

// |---------------- 容量是否足够?

// ↓

// -----------------------------------------

// Yes | | No

// | |

// ↓ |

// 从opsition开始, 整体向后移动一个位置 |

// construct(finish, *(finish - 1)); |

// ++finish; |

// T x_copy = x; |

// copy_backward(position, finish - 2, finish - 1); |

// *position = x_copy; |

// ↓

// data_allocator::allocate(len);

// uninitialized_copy(start, position, new_start);

// construct(new_finish, x);

// ++new_finish;

// uninitialized_copy(position, finish, new_finish);

// destroy(begin(), end());

// deallocate();

template <class T, class Alloc>

void insert_aux(iterator position, const T& x)

{

if (finish != end_of_storage) // 还有备用空间

{

// 在备用空间起始处构造一个元素,并以vector最后一个元素值为其初值

construct(finish, *(finish - 1));

++finish;

T x_copy = x;

copy_backward(position, finish - 2, finish - 1);

*position = x_copy;

}

else // 已无备用空间

{

const size_type old_size = size();

const size_type len = old_size != 0 ? 2 * old_size : 1;

// 以上配置元素:如果大小为0,则配置1(个元素大小)

// 如果大小不为0,则配置原来大小的两倍

// 前半段用来放置原数据,后半段准备用来放置新数据

iterator new_start = data_allocator::allocate(len); // 实际配置

iterator new_finish = new_start;

// 将内存重新配置

try

{

// 将原vector的安插点以前的内容拷贝到新vector

new_finish = uninitialized_copy(start, position, new_start);

// 为新元素设定初值 x

construct(new_finish, x);

// 调整水位

++new_finish;

// 将安插点以后的原内容也拷贝过来

new_finish = uninitialized_copy(position, finish, new_finish);

}

catch(…)

{

// 回滚操作

destroy(new_start, new_finish);

data_allocator::deallocate(new_start, len);

throw;

}

// 析构并释放原vector

destroy(begin(), end());

deallocate();

// 调整迭代器,指向新vector

start = new_start;

finish = new_finish;

end_of_storage = new_start + len;

}

}

// 在指定位置插入n个元素

// insert(iterator position, size_type n, const T& x)

// |

// |---------------- 插入元素个数是否为0?

// ↓

// -----------------------------------------

// No | | Yes

// | |

// | ↓

// | return;

// |----------- 内存是否足够?

// |

// -------------------------------------------------

// Yes | | No

// | |

// |------ (finish - position) > n? |

// | 分别调整指针 |

// ↓ |

// ---------------------------- |

// No | | Yes |

// | | |

// ↓ ↓ |

// 插入操作, 调整指针 插入操作, 调整指针 |

// ↓

// data_allocator::allocate(len);

// new_finish = uninitialized_copy(start, position, new_start);

// new_finish = uninitialized_fill_n(new_finish, n, x);

// new_finish = uninitialized_copy(position, finish, new_finish);

// destroy(start, finish);

// deallocate();

template <class T, class Alloc>

void insert(iterator position, size_type n, const T& x) //注意看,这里传进来的是拷贝

{

// 如果n为0则不进行任何操作

if (n != 0)

{

if (size_type(end_of_storage - finish) >= n)

{ // 剩下的备用空间大于等于“新增元素的个数”

T x_copy = x;

// 以下计算插入点之后的现有元素个数

const size_type elems_after = finish - position;

iterator old_finish = finish;

if (elems_after > n)

{

// 插入点之后的现有元素个数 大于 新增元素个数

uninitialized_copy(finish - n, finish, finish);

finish += n; // 将vector 尾端标记后移

copy_backward(position, old_finish - n, old_finish);

fill(position, position + n, x_copy); // 从插入点开始填入新值

}

else

{

// 插入点之后的现有元素个数 小于等于 新增元素个数

uninitialized_fill_n(finish, n - elems_after, x_copy);

finish += n - elems_after;

uninitialized_copy(position, old_finish, finish);

finish += elems_after;

fill(position, old_finish, x_copy);

}

}

else

{ // 剩下的备用空间小于“新增元素个数”(那就必须配置额外的内存)

// 首先决定新长度:就长度的两倍 , 或旧长度+新增元素个数

const size_type old_size = size();

const size_type len = old_size + max(old_size, n);

// 以下配置新的vector空间

iterator new_start = data_allocator::allocate(len);

iterator new_finish = new_start;

__STL_TRY

{

// 以下首先将旧的vector的插入点之前的元素复制到新空间

new_finish = uninitialized_copy(start, position, new_start);

// 以下再将新增元素(初值皆为n)填入新空间

new_finish = uninitialized_fill_n(new_finish, n, x);

// 以下再将旧vector的插入点之后的元素复制到新空间

new_finish = uninitialized_copy(position, finish, new_finish);

}

ifdef __STL_USE_EXCEPTIONS

catch(…)

{

destroy(new_start, new_finish);

data_allocator::deallocate(new_start, len);

throw;

}

endif /* __STL_USE_EXCEPTIONS */

destroy(start, finish);

deallocate();

start = new_start;

finish = new_finish;

end_of_storage = new_start + len;

}

}

}

};


list

template <class T, class Alloc = alloc>

class list {

···

public:

list() { empty_initialize(); }

iterator begin() { return (link_type)((*node).next); }

const_iterator begin() const { return (link_type)((*node).next); }

iterator end() { return node; }

const_iterator end() const { return node; }

reverse_iterator rbegin() { return reverse_iterator(end()); }

const_reverse_iterator rbegin() const {

return const_reverse_iterator(end());

}

reverse_iterator rend() { return reverse_iterator(begin()); }

const_reverse_iterator rend() const {

return const_reverse_iterator(begin());

}

bool empty() const { return node->next == node; }

size_type size() const {

size_type result = 0;

distance(begin(), end(), result);

return result;

}

size_type max_size() const { return size_type(-1);

reference front() { return *begin(); }

const_reference front() const { return *begin(); }

reference back() { return *(–end()); }

const_reference back() const { return *(–end()); }

void swap(list<T, Alloc>& x) { __STD::swap(node, x.node); }

iterator insert(iterator position, const T& x) {

link_type tmp = create_node(x);

tmp->next = position.node;

tmp->prev = position.node->prev;

(link_type(position.node->prev))->next = tmp;

position.node->prev = tmp;

return tmp;

}

iterator insert(iterator position) { return insert(position, T()); }

template

void insert(iterator position, InputIterator first, InputIterator last);

void insert(iterator pos, size_type n, const T& x);

void insert(iterator pos, int n, const T& x) {

insert(pos, (size_type)n, x);

}

void insert(iterator pos, long n, const T& x) {

insert(pos, (size_type)n, x);

}

void push_front(const T& x) { insert(begin(), x); }

void push_back(const T& x) { insert(end(), x); }

iterator erase(iterator position) {

link_type next_node = link_type(position.node->next);

link_type prev_node = link_type(position.node->prev);

prev_node->next = next_node;

next_node->prev = prev_node

destroy_node(position.node);

return iterator(next_node);

}

iterator erase(iterator first, iterator last);

void resize(size_type new_size, const T& x);

void resize(size_type new_size) { resize(new_size, T()); }

void clear();

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

pe prev_node = link_type(position.node->prev);

prev_node->next = next_node;

next_node->prev = prev_node

destroy_node(position.node);

return iterator(next_node);

}

iterator erase(iterator first, iterator last);

void resize(size_type new_size, const T& x);

void resize(size_type new_size) { resize(new_size, T()); }

void clear();

[外链图片转存中…(img-SW8vWQgU-1715751697058)]
[外链图片转存中…(img-QrL5FAYh-1715751697059)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值