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

白子寰 2024-10-18 13:05:08 阅读 74

🌈 个人主页:白子寰

🔥 分类专栏:重生之我在学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)中,<code>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

<code>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[]

<code>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

<code>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

<code>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 



什么是迭代器失效

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

简单来说:

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

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

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

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

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

如何避免迭代器失效

专业术语:

1、重获迭代器:在容器修改操作后,使用返回的有效迭代器更新现有迭代器。

2、范围删除:使用基于范围的 erase 方法来删除元素,避免单独删除导致的迭代器失效。

3、避免失效操作:了解哪些容器操作会导致迭代器失效,并尽量规避。

简单来讲:

更新指针:当你删除或添加元素后,记得重新获取新的迭代器位置。

一次性清理:如果需要删除多个元素,尽量一次性完成,而不是一个一个删。

别用坏指针:知道哪些操作会让迭代器变坏,就不要在那些操作后继续使用旧的迭代器。

总结

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

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




 

***********************************************************分割线*****************************************************************************

完结!!!

感谢浏览和阅读。

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

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

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。

你的点赞和关注是我持续写作的动力!!! 

好了划走吧。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。