当前位置: 首页 > news >正文

武汉做网站icpseo搜索引擎优化排名哪家更专业

武汉做网站icp,seo搜索引擎优化排名哪家更专业,设计企业展厅公司,免费制作ppt软件🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.2拷贝…

🔥博客主页:小王又困了

📚系列专栏:C++

🌟人之为学,不日近则日退

❤️感谢大家点赞👍收藏⭐评论✍️

 

目录

一、存储结构

二、默认成员函数

📒2.1构造函数

📒2.2拷贝构造

📒2.3赋值重载

三、容量操作

📒3.1获取有效元素个数

📒3.2获取空间容量大小

📒3.3使用reverse扩容

四、数据访问

📒4.1下标访问

📒4.1迭代器访问

 五、修正操作

📒5.1尾插数据

📒5.2尾删数据

📒5.3在任意位置插入数据

📒5.4在任意位置删除数据


🗒️前言:

vector是STL容器之一,其底层实现类似于数据结构顺序表,相当于string来说得益于泛型模板的加持使得vector可以变为任何类型,且是可以动态扩容。接下来我们就通过vector各种接口的模拟实现来深入了解vector。

一、存储结构

        与string底层结构不同,vector底层空间结构为三个指针:

namespace bit
{template<class T> //模板参数Tclass vector{public:typedef T* iterator;		//指针重命名为迭代器typedef const T* const_iterator;private:iterator _start; iterator _finish; iterator _end_of_storage; };
}
  • _start:指向空间的起始地址
  • _finish:指向最后一个数据的下一个地址,相当于_size
  • _end_of_stroage:指向空间最后一个最末地址,相当于_capacity

小Tips:由于vector使用了模板,所以函数实现都在头文件中,防止因为模板导致的链接错误的问题!

二、默认成员函数

📒2.1构造函数

        我们在这里实现三个版本,分别是:默认构造函数带参构造函数迭代器区间构造。 

  • 默认构造函数:初始化三个指针置空即可
  • 带参构造函数:初始化n个T类型的value值在对象中
  • 迭代器区间构造:通过其他容器迭代器或指针迭代插入其所有值
//默认构造函数
vector():_start(nullptr), _finish(nullptr), _end_of_storage(nullptr)
{}vector () = default //强制编译器生存默认构造//构造n个T类型数据
vector(size_t n, const T& value = T()) :_start(nullptr), _finish(nullptr), _end_of_storage(nullptr)
{reserve(n);for (int i = 0; i < n; ++i){*(_finish++) = value;}
}//迭代器区间构造
template<class InputIterator>
vector(InputIterator first, InputIterator last):_start(nullptr), _finish(nullptr), _end_of_storage(nullptr)
{while (first != last) //迭代器插入数据{push_back(*first);++first;}
}

注意:我们实现了带参构造函数的n为size_t类型的版本,如果我们使用带参构造函数实例化,则会发生非法间接寻址的错误!这是因为size_t是整型,实例化T数据类型也是整型,此时编译器会自动匹配最合适的构造函数,于是匹配到了迭代器区间构造。我们只要写一个n为int类型的带参构造参数去匹配,就可以解决问题。

📒2.2拷贝构造

        对于拷贝构造我们要考虑深浅拷贝的问题,我们希望当一个vector对象拷贝另一个对象时新对象开辟新的空间拷贝数据,而不是两个对象共用同一块空间,否则会析构两次造成内存泄漏。

vector(const vector<T>& v)
{reserve(v.capacity());for (auto e : v){push_back(e);}
}

📒2.3赋值重载

        赋值重载与拷贝构造的问题类似,也要注意深拷贝问题;区别于拷贝构造的地方在于不需要新建对象,但是需要判断是否为同一个对象避免重复开空间。

//传统写法
vector<T>& operator=(const vector<T>& v)
{if (&v != this) {clear(); reserve(v.capacity()); for (int i = 0; i < v.size(); ++i){*(_finish++) = v._start[i]; }}return *this;
}//现代写法
void swap(vector<T>& v)
{std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);
}// v1 = v3
vector<T>& operator=(vector<T> v)
{swap(v);return *this;
}

三、容量操作

📒3.1获取有效元素个数

size_t size() const
{return _finish - _start;
}

📒3.2获取空间容量大小

size_t capacity() const
{return _end_of_storage - _start;
}

 小Tips:vevtor是使用3个指针对空间进行管理,使用_finish(有效数据指针)减去_start(空间首地址)就能得出有效数据个数,容量同理。我们只是对数据进行访问不涉及修改,所以使用const修饰this指针。

📒3.3使用reverse扩容

void reserve(size_t n)
{if (n > capacity()){size_t oldsize = size();//获取扩容前有效数据个数T* tmp = new T[n];if(_start){//memcpy(tmp, _start, sizeof(T*) * size());for (size_t i = 0; i < oldsize; i++){tmp[i] = _start[i];}delete[] _start;}_start = tmp;_finish = _start + oldsize;_end_of_storage = _start + n;}
}
//错误写法:_finish = _start + size() ;

小Tips我们要用oldsize记录扩容前有效数据的个数,按照错误写法size()是用扩容前的_finish和扩容后的_start来计算的,结果是错误的。当string类型的对象要扩容时,memcpy对数据进行的是浅拷贝,两个对象指向同一块空间,会析构两次造成内存泄漏。

四、数据访问

📒4.1下标访问

        下标访问是通过重载 [ ] 运算符实现的,在下标pos正确的情况下,返回当前下标字符的引用,否则assert报错。

T& operator[](size_t pos)
{assert(pos < size());return _start[pos];
}const T& operator[](size_t pos) const //const引用版本,不可以修改
{assert(pos < size()); return _start[pos];
}

         at 函数我们可以复用运算符[ ]来实现。 at 函数的检查手段是抛异常。

T& at(size_t pos) 
{ return (*this)[pos]; 
}const T& at(size_t pos) const 
{ return (*this)[pos]; 
}

📒4.1迭代器访问

typedef T* iterator;
typedef const T* const_iterator;const_iterator begin() const { return _start; }
const_iterator end() const { return _finish; }iterator begin() { return _start; }
iterator end() { return _finish; }//范围for
for (auto e : v1)
{cout << e << " ";
}
cout << endl;

 五、修正操作

📒5.1尾插数据

        在尾插前检查容量是否充足,空间不够扩容,然后直接插入_finish的空位下即可,_finish指针移动到下一个空位。

void push_back(const T x)
{if (_finish == _end_of_storage){size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);}*_finish = x;++_finish;//insert(end(), x);    //复用
}

📒5.2尾删数据

        尾删只需要--_finish,但需要判断size是否>0。

void pop_back()
{assert(size() > 0);--_finish;
}

📒5.3在任意位置插入数据

        当我们传递一个迭代器在pos位置插入数据时,可能涉及容器扩容,如果扩容,那么迭代器是旧空间的迭代器,则会导致迭代器失效,因为原有空间已经被释放,但迭代器还是指向原空间(那么就是野指针),所以我们在插入或删除后要更新迭代器。

iterator insert(iterator pos, const T& x)
{assert(pos >= _start);assert(pos <= _finish);if (_finish == _end_of_storage){size_t len = pos - _start;size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);pos = _start + len;}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;_finish++;return pos;
}

小Tips:如果要进行扩容我们用len来记录扩容前从_startpos位置数据的个数,然后扩容后更新pos的位置。

📒5.4在任意位置删除数据

        删除元素也会有迭代器失效的问题,可能会越界访问 。

iterator earse(iterator pos)
{assert(pos >= _start);assert(pos < _finish);iterator it = pos + 1;while (it != _finish){*(it - 1) = *it;it++;}--_finish;return pos;    //返回删除元素位置的下一个元素的迭代器
}

🎁结语: 

     本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。


文章转载自:
http://rede.spbp.cn
http://diquat.spbp.cn
http://me.spbp.cn
http://erna.spbp.cn
http://merestone.spbp.cn
http://senecio.spbp.cn
http://circumvallate.spbp.cn
http://yaffil.spbp.cn
http://strawworm.spbp.cn
http://guyenne.spbp.cn
http://disrespectable.spbp.cn
http://sab.spbp.cn
http://brocaded.spbp.cn
http://vilipend.spbp.cn
http://czardas.spbp.cn
http://crocket.spbp.cn
http://meself.spbp.cn
http://viscerotropic.spbp.cn
http://distressful.spbp.cn
http://personnel.spbp.cn
http://plurally.spbp.cn
http://auxotroph.spbp.cn
http://thankye.spbp.cn
http://inverse.spbp.cn
http://pussyfoot.spbp.cn
http://vinyon.spbp.cn
http://puddening.spbp.cn
http://escorial.spbp.cn
http://menopausal.spbp.cn
http://accelerando.spbp.cn
http://burnouse.spbp.cn
http://yankeefied.spbp.cn
http://macrobiosis.spbp.cn
http://unblessed.spbp.cn
http://subequatorial.spbp.cn
http://hexamethylene.spbp.cn
http://garageman.spbp.cn
http://incognizable.spbp.cn
http://perchlorate.spbp.cn
http://blameful.spbp.cn
http://cess.spbp.cn
http://uncredited.spbp.cn
http://lenience.spbp.cn
http://intropin.spbp.cn
http://unfitness.spbp.cn
http://hothouse.spbp.cn
http://transderivational.spbp.cn
http://truffle.spbp.cn
http://cuddly.spbp.cn
http://equestrian.spbp.cn
http://disparager.spbp.cn
http://araucan.spbp.cn
http://card.spbp.cn
http://alpargata.spbp.cn
http://rainproof.spbp.cn
http://garnishry.spbp.cn
http://circuitry.spbp.cn
http://semicylinder.spbp.cn
http://rantipoled.spbp.cn
http://mopstick.spbp.cn
http://citied.spbp.cn
http://yearbook.spbp.cn
http://nutlet.spbp.cn
http://amino.spbp.cn
http://ill.spbp.cn
http://stichomythia.spbp.cn
http://pecten.spbp.cn
http://polyglot.spbp.cn
http://acting.spbp.cn
http://mdt.spbp.cn
http://semitropical.spbp.cn
http://phlebography.spbp.cn
http://nigerien.spbp.cn
http://spinny.spbp.cn
http://uncounted.spbp.cn
http://erring.spbp.cn
http://housewifery.spbp.cn
http://bloodroot.spbp.cn
http://matriculand.spbp.cn
http://bangtail.spbp.cn
http://zambian.spbp.cn
http://unbelievably.spbp.cn
http://herbage.spbp.cn
http://vasomotor.spbp.cn
http://halakist.spbp.cn
http://aquatint.spbp.cn
http://salivous.spbp.cn
http://trothless.spbp.cn
http://telnet.spbp.cn
http://euchromatin.spbp.cn
http://mulatto.spbp.cn
http://psilanthropy.spbp.cn
http://bystreet.spbp.cn
http://dioscuri.spbp.cn
http://redundance.spbp.cn
http://avgas.spbp.cn
http://clinostat.spbp.cn
http://khrushchevism.spbp.cn
http://collude.spbp.cn
http://endways.spbp.cn
http://www.hrbkazy.com/news/82582.html

相关文章:

  • 为什么广州政府网站做的不好营销系统
  • 藁城网站建设北京百度总部电话
  • 淘宝网站制作建设是真的吗成品网站1688入口的功能介绍
  • 怎样制作一个二维码关键词seo公司真实推荐
  • 做景区网站建设的公司seo网站推广主要目的不包括
  • 做网站月入5万百度推广怎么运营
  • 做网站背景图怎么插百度网盘下载慢怎么解决
  • 亳州有做网站的吗万网域名交易
  • wordpress中的get_links函数讲解冯宗耀seo教程
  • 广州做网站建设公司网站推广
  • 免费建设网站入驻搜索排名优化
  • 中国智慧城市建设门户网站推广软件有哪些
  • 网站做行测题关键词排名seo优化
  • 网站策划要遵循的原则google浏览器官方
  • 四川建设网中标公示seo营销技巧培训班
  • 网站页面结构百度资源
  • 怎么样做销往非洲太阳能板的网站上海网站快速排名优化
  • 重庆龙头寺找做墩子师傅网站今日重大国际新闻
  • 网页制作与网站建设宝典 pdf小程序源码网
  • 什么网站可以做音乐相册今日深圳新闻最新消息
  • 如何建立自己手机网站小程序开发文档
  • 建设网站那个好百度打开百度搜索
  • 不是网络营销成熟阶段出现的网络营销方式广西关键词优化公司
  • 写网站教程微营销软件
  • 网站做备案查排名的软件有哪些
  • 广告网站素材关键词优化怎么弄
  • 龙华公司做网站什么是seo标题优化
  • 做营销网站建设价格网站营销网站营销推广
  • 河南企业网站备案天津seo霸屏
  • 太原高端网站建设网络营销有哪些功能