当前位置:首页 » 《关于电脑》 » 正文

【C++打怪之路Lv9】-- vector

26 人参与  2024年10月24日 12:00  分类 : 《关于电脑》  评论

点击全文阅读


? 个人主页:白子寰
? 分类专栏:重生之我在学Linux,C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集? 希望得到您的订阅和支持~
? 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

 

目录

什么是vector

vector的特点

vector常用的函数接口

1)构造函数

①默认构造函数,创造一个空的vector容器

②构造一个vector类对象并用n个val初始化

③拷贝构造函数

④使用迭代器进行初始化构造

2)容量操作

①size

②capacity

③empty

④resize

⑤reverse 

3)访问和遍历

①operator[]

②迭代器(正向和反向迭代器)

③at

④front and back

4)vector的增删查改

①push_back

②pop_back

③find

④insert

⑤erase

⑥swap

⑦assign 

⑧clear

什么是迭代器失效

如何避免迭代器失效


 

什么是vector

在 C++ 标准模板库(STL)中,vector 是一种序列容器,表示可以改变大小的数组。

它是通过模板实现的,因此可以用于存储任何类型的对象,只要这些对象支持拷贝构造函数和析构函数

vector的特点

动态数组vector 在内部使用一个动态分配的数组来存储元素。当数组满时,vector 会自动重新分配更大的内存空间,并将现有元素复制到新的内存位置。

连续存储vector 保证所有元素都存储在连续的内存位置中,这使得通过索引访问元素非常高效。

随机访问:由于元素是连续存储的,vector 支持快速随机访问,时间复杂度为 O(1)。

动态大小vector 可以在运行时动态地增加或减少其大小,这是通过 push_backpop_backinsert 和 erase 等成员函数实现的。

自动内存管理vector 管理自己的内存,当 vector 被销毁或其大小被减少时,它会自动释放不再需要的内存


vector常用的函数接口

1)构造函数

①默认构造函数,创造一个空的vector容器

vector();

②构造一个vector类对象并用n个val初始化

vector(size_t n, const value_type& val);

创建一个包含 n 个元素的 vector,并且所有元素都是初始值 val 使用 

注:value_type 是 vector 存储元素的类型

③拷贝构造函数

vector(const vector& other);

 创建一个新 vector 作为另一个已存在 vector 的副本使用

④使用迭代器进行初始化构造

template <class InputIterator>vector(InputIterator first, InputIterator last);

 使用迭代器指定的范围来初始化 vector 时使用,这个范围包括 [first, last) 中的元

注:InputIterator 是一种迭代器类型,它可以是任何能够用于迭代的类型,比如指针或者其它容器的迭代器




 

2)容量操作

①size

size_t size() const;

获取vector中元素个数 

②capacity

size_t capacity() const;

 获取vector当前容量( vector 在不重新分配内存的情况下可以容纳的最大元素数量)

③empty

bool empty() const;

检查vector是否为空 

④resize

void resize(size_t n, value_type val = value_type());

改变vector的大小,多出来的会填充默认值

用来调整 vector 的大小到 n 个元素。

①如果 n 小于当前大小,则删除多余的元素;

②如果 n 大于当前大小,则添加新元素,并用 val 初始化它们

⑤reverse 

void reserve(size_t n);

设置vector的容量 

用来预留至少能够容纳 n 个元素的内存空间。这不会改变 vector 的 size,但会增加其 capacity


 

 



 

3)访问和遍历

①operator[]

reference operator[](size_t n);const_reference operator[](size_t n) const;

访问vector中的元素 

通过索引 n 访问 vector 中的元素。不检查索引是否有效,因此使用时需确保索引在有效范围内

注:reference 和 const_reference 分别表示对 vector 元素的引用和常量引用

②迭代器(正向和反向迭代器)

iterator begin();const_iterator begin() const;iterator end();const_iterator end() const;reverse_iterator rbegin();const_reverse_iterator rbegin() const;reverse_iterator rend();const_reverse_iterator rend() const;

遍历vector中的元素

③at

reference at(size_type n);const_reference at(size_type n) const;

访问vector中的元素,并提供边界检查

通过索引 n 安全地访问 vector 中的元素。如果索引无效,则抛出 std::out_of_range 异常

④front and back

reference front();const_reference front() const;reference back();const_reference back() const;

front -- 访问vector的第一个元素 

back -- 访问vector的最后一个元素 

[如vector为空,则行为未定义]




 

4)vector的增删查改

①push_back

void push_back(const value_type& val);

在vector的末尾添加一个元素,如果需要,会自动增加 vector 的容量

②pop_back

void pop_back();

删除vector末尾的元素

③find

template <typename InputIterator, typename T>InputIterator find(InputIterator first, InputIterator last, const T& val);

find查找两个迭代器区间的val值

find不是vector的成员函数 

④insert

iterator insert(const_iterator position, const value_type& val);iterator insert(const_iterator position, size_type n, const value_type& val);template <class InputIterator>iterator insert(const_iterator position, InputIterator first, InputIterator last);

 在迭代器 插入1个 或多个元素 或一个vector类对象


 


 

⑤erase

iterator erase(const_iterator position);iterator erase(const_iterator first, const_iterator last);

⑥swap

void assign(size_type n, const value_type& val);template <class InputIterator>void assign(InputIterator first, InputIterator last);

⑦assign 

void assign(size_type n, const value_type& val);template <class InputIterator>void assign(InputIterator first, InputIterator last);

  为vector指定新内容

⑧clear

void clear() noexcept;

清空,size为0 



什么是迭代器失效

迭代器的失效是指由于容器的修改操作,使得原有迭代器不再有效,无法正确访问容器元素

简单来说:

迭代器失效就像是你拿着指向某个物品的指针,但物品的位置变了,你的指针就找不到原来的物品了

通常发生在以下几种情况:

容器内存重新分配:当容器如 vector 或 string 因为增加元素而需要重新分配内存时,之前指向容器元素的迭代器、指针和引用会失效。

容器元素删除:当通过 eraseclear 或 pop_back 等操作从容器中删除元素时,指向被删除元素或被删除元素之后元素的迭代器会失效。

容器插入操作:在序列容器(如 vectordequestring)中插入元素可能会使插入点之后的所有迭代器失效

如何避免迭代器失效

专业术语:

1、重获迭代器:在容器修改操作后,使用返回的有效迭代器更新现有迭代器。
2、范围删除:使用基于范围的 erase 方法来删除元素,避免单独删除导致的迭代器失效。
3、避免失效操作:了解哪些容器操作会导致迭代器失效,并尽量规避。
简单来讲:

更新指针:当你删除或添加元素后,记得重新获取新的迭代器位置。
一次性清理:如果需要删除多个元素,尽量一次性完成,而不是一个一个删。
别用坏指针:知道哪些操作会让迭代器变坏,就不要在那些操作后继续使用旧的迭代器。
总结

避免迭代器失效的关键在于

操作后更新迭代器,批量处理元素,以及避免使用已失效的迭代器




 

***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

“以结果为导向,主动去争取”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/176750.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 林晚夏江肆年(进错房,嫁给八零最牛特种兵在线阅读)全文免费阅读无弹窗大结局_(林晚夏江肆年)进错房,嫁给八零最牛特种兵在线阅读免费阅读全文最新章节列表_笔趣阁(林晚夏江肆年) -
  • 进错房,嫁给八零最牛特种兵完整版阅读小说(林晚夏江肆年)全文免费阅读无弹窗大结局_(进错房,嫁给八零最牛特种兵完整版阅读)林晚夏江肆年免费阅读全文最新章节列表_笔趣阁(进错房,嫁给八零最牛特种兵完整版阅读) -
  • 新雪藏旧事全文全文(商云萝周砚京)全文免费阅读无弹窗大结局_(新雪藏旧事全文小说免费阅读)最新章节列表_笔趣阁(新雪藏旧事全文) -
  • 在线免费小说重生七零替嫁:不嫁教授,嫁军官_乔珊珊乔婉月新热门小说_热门小说乔珊珊乔婉月
  • 免费小说《冯云漪厉晋泽》已完结(冯云漪厉晋泽)热门小说大结局全文阅读笔趣阁
  • 祁兰湘邵黎晖小说_祁兰湘邵黎晖完整版大结局小说免费阅读
  • 完整免费小说老公心疼青梅将她留宿新房,却将怀孕的我赶出家门(乔玥傅慎行姜禾)_老公心疼青梅将她留宿新房,却将怀孕的我赶出家门(乔玥傅慎行姜禾)完本小说免费阅读(乔玥傅慎行姜禾)
  • 新雪藏旧事:结局+番外+完结免费小说在线阅读_小说完结推荐新雪藏旧事:结局+番外+完结商云萝周砚京热门小说
  • 初逢青山梦长安(顾怀瑾沈书妤)阅读 -
  • 无删减版《绝对权力:从天崩开局走上官途巅峰》在线免费阅读
  • 《绝对权力:从天崩开局走上官途巅峰》小说在线试读,《绝对权力:从天崩开局走上官途巅峰》最新章节目录
  • 裴泽苏星辰何娇(满目星辰不及你小说)精彩章节在线阅读

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1