C++基础(6.vector与迭代器失效)

目录

vector介绍:

 Vector的各种用法:

1. 基本构造函数

2. 赋值运算符

3. 大小和容量

4. 访问元素

5. 修改元素

6. 其他功能

7. 迭代器

 迭代器失效问题:

迭代器失效的原因

迭代器失效的影响

迭代器失效的的返回值


vector介绍:

C++ 中的 vector 是一种序列容器,它允许你在运行时动态地插入和删除元素。

vector 是基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存

与 C++ 数组相比,vector 具有更多的灵活性和功能,使其成为 C++ 中常用的数据结构之一。 

vector 是 C++ 标准模板库(STL)的一部分,提供了灵活的接口和高效的操作。

基本特性:

  • 动态大小vector 的大小可以根据需要自动增长和缩小。
  • 连续存储vector 中的元素在内存中是连续存储的,这使得访问元素非常快速。
  • 可迭代vector 可以被迭代,你可以使用循环(如 for 循环)来访问它的元素。
  • 元素类型vector 可以存储任何类型的元素,包括内置类型、对象、指针等。

使用场景:

  • 当你需要一个可以动态增长和缩小的数组时。
  • 当你需要频繁地在序列的末尾添加或移除元素时。
  • 当你需要一个可以高效随机访问元素的容器时。

要使用 vector,首先需要包含 <vector> 头文件:#include <vector>

 


 

 Vector的各种用法:

1. 基本构造函数

  • 默认构造函数

    std::vector<int> vec;
    

    创建一个空的 vector

  • 指定大小的构造函数

    std::vector<int> vec(size_t n);
    

    创建一个包含 n 个元素的 vector,元素值初始化为默认值(对于基本类型为 0)。

  • 指定大小和初始值的构造函数

    std::vector<int> vec(size_t n, const int& value);
    

    创建一个包含 n 个元素的 vector,所有元素初始化为 value

  • 拷贝构造函数

    std::vector<int> vec(const std::vector<int>& other);
    

    通过拷贝另一个 vector 的内容来初始化。

  • 移动构造函数

    std::vector<int> vec(std::vector<int>&& other) noexcept;
    

    通过移动另一个 vector 的内容来初始化,避免不必要的拷贝。

2. 赋值运算符

  • 拷贝赋值运算符

    std::vector<int>& operator=(const std::vector<int>& other);
    

    将一个 vector 的内容复制到另一个 vector

  • 移动赋值运算符

    std::vector<int>& operator=(std::vector<int>&& other) noexcept;
    

    将一个 vector 的内容移动到另一个 vector

3. 大小和容量

  • size()

    size_t size() const;
    

    返回当前 vector 中元素的数量。

  • capacity()

    size_t capacity() const;
    

    返回 vector 当前分配的容量(可以容纳的元素数量)。

  • empty()

    bool empty() const;
    

    检查 vector 是否为空。

  • resize()

    void resize(size_t n);
    void resize(size_t n, const T& value);
    

    调整 vector 的大小。如果新大小大于当前大小,新增的元素初始化为 value

  • reserve()

    void reserve(size_t n);
    

    请求分配至少能够容纳 n 个元素的空间,避免频繁的内存重分配。

  • shrink_to_fit()

    void shrink_to_fit();
    

    请求减少 vector 的容量以适应其当前大小。

4. 访问元素

  • operator[]

    T& operator[](size_t n);
    const T& operator[](size_t n) const;
    

    返回指定位置的元素,不进行边界检查。

  • at()

    T& at(size_t n);
    const T& at(size_t n) const;
    

    返回指定位置的元素,进行边界检查。

  • front()

    T& front();
    const T& front() const;
    

    返回第一个元素的引用。

  • back()

    T& back();
    const T& back() const;
    

    返回最后一个元素的引用。

  • data()

    T* data();
    const T* data() const;
    

    返回指向 vector 中第一个元素的指针。

5. 修改元素

  • push_back()

    void push_back(const T& value);
    void push_back(T&& value);
    

    vector 的末尾添加一个元素。

  • pop_back()

    void pop_back();
    

    删除 vector 的最后一个元素。

  • insert()

    iterator insert(iterator pos, const T& value);
    iterator insert(iterator pos, T&& value);
    iterator insert(iterator pos, size_t n, const T& value);
    template <class InputIt>
    iterator insert(iterator pos, InputIt first, InputIt last);
    

    在指定位置插入一个或多个元素。

  • erase()

    iterator erase(iterator pos);
    iterator erase(iterator first, iterator last);
    

    删除指定位置或范围的元素。

  • clear()

    void clear();
    

    删除所有元素。

6. 其他功能

  • swap()

    void swap(std::vector<T>& other) noexcept;
    

    交换两个 vector 的内容。

  • assign()

    void assign(size_t n, const T& value);
    template <class InputIt>
    void assign(InputIt first, InputIt last);
    

    重新赋值 vector 的内容。

7. 迭代器

std::vector 提供了多种迭代器支持,包括:

  • begin() 和 **end()**:

    iterator begin();
    iterator end();
    const_iterator begin() const;
    const_iterator end() const;
    

    返回指向第一个元素和最后一个元素之后位置的迭代器。

  • rbegin()rend()

    reverse_iterator rbegin();
    reverse_iterator rend();
    const_reverse_iterator rbegin() const;
    const_reverse_iterator rend() const;
    

    返回指向最后一个元素和第一个元素之前位置的反向迭代器。


 迭代器失效问题:

迭代器失效的原因

  1. 插入操作

    • 当在 vector 中插入元素时,如果当前存储的元素数量超过了其容量,vector 会重新分配内存,复制现有元素到新的内存位置,并释放旧的内存。这会导致所有指向旧内存的迭代器失效。
  2. 删除操作

    • 当从 vector 中删除元素时,删除操作会导致后面的元素向前移动,以填补空缺。这会使得指向被删除元素的迭代器失效,且指向被移动元素的迭代器也可能失效。
  3. 清空操作

    • 调用 clear() 方法会删除所有元素,导致所有迭代器失效。

迭代器失效的影响

失效的迭代器可能会导致未定义行为,包括程序崩溃或数据损坏。因此,在使用迭代器时,必须小心处理插入和删除操作,在进行相关操作后应避免使用已经失效的迭代器。

迭代器失效的的返回值

在处理迭代器失效问题上,当迭代器失效时候会返回原本失效的下一个位置

举例:

我们可以看到在遇到0的时候erase之后迭代器失效再用会导致程序崩溃。

但是因为迭代器在erase的时候失效了但是erase还会返回失效前的下一个位置,我们再用迭代器去接收就可以正常运行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值