博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ vector详解
阅读量:7145 次
发布时间:2019-06-29

本文共 1487 字,大约阅读时间需要 4 分钟。

容器有太多需要清楚细节的地方,同时也有太多值得学习的地方。下文作为学习、工作中用到vector的总结。

1. 赋值运算=的实现原理

在使用赋值操作时,如果不清楚内部是怎么实现,那么用起来会畏手畏脚。

先来看下stl_vector.h中对于=的重载函数。

template 
vector
& vector
::operator=(const vector
& x) { if (&x != this) { // 如果x.size() > capacity()那么就需要重新分配内存 // 首先分配内存, 并将容器内原来的元素拷贝到新分配内存中 // 然后析构原容器中元素, 调整内存状态变量 if (x.size() > capacity()) { iterator tmp = allocate_and_copy(x.end() - x.begin(), x.begin(), x.end()); destroy(start, finish); deallocate(); start = tmp; end_of_storage = start + (x.end() - x.begin()); } else if (size() >= x.size()) { iterator i = copy(x.begin(), x.end(), begin()); destroy(i, finish); } else { copy(x.begin(), x.begin() + size(), start); uninitialized_copy(x.begin() + size(), x.end(), finish); } finish = start + x.size(); } return *this; }

从上述代码发现,上述代码处理了容量问题,却没有写出copy细节,然后我们继续去找。

在stl_algobase.h中找到了copy的代码,(copy调用了__copy)

template 
inline _OutputIter __copy(_InputIter __first, _InputIter __last, _OutputIter __result, input_iterator_tag, _Distance*){ for ( ; __first != __last; ++__result, ++__first) *__result = *__first; return __result;}

而stl中迭代器就是元素的指针,这下终于看清楚啦,原来就是先确认有足够的空间,然后调用相应类型的赋值(=)函数。

 

转载地址:http://nmgrl.baihongyu.com/

你可能感兴趣的文章
attempted to assign id from null one-to-one
查看>>
Miller-Rabin判质数和Pollared-Rho因数分解
查看>>
关于ajax请求数据后,数据本身的js失效的一些想法
查看>>
06-Flutter移动电商实战-dio基础_Get_Post请求和动态组件协作
查看>>
基础认识
查看>>
【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?...
查看>>
GetWindowRect和GetClientRect比较学习
查看>>
thinkphp 多表事务处理
查看>>
11-散列1 电话聊天狂人
查看>>
学SEO你其实只需要半个钟
查看>>
3G网卡PPP拨号
查看>>
AS3.0中的反射概念
查看>>
UIViewController中各方法调用顺序及功能详解
查看>>
C++ do{...}while(0)的好处
查看>>
【Todo】Python字符编码学习
查看>>
python实现朴素贝叶斯
查看>>
Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
查看>>
Java操作MongoDB:连接&增&删&改&查
查看>>
Maven使用
查看>>
用python脚本把windows的文件上传到linux中
查看>>