【C++】vector的使用(下)

简介: 【C++】vector的使用(下)

de55415a2d79826507f38d239deb5257.png5. 数据访问


与string类似,在数据访问中也有很多接口,但是最常用的还是[]的重载,其余基本不常用,这里我们就不过多赘述

9005da39fa2134462c8e7b4a1bb404cf.png

[]实际上是一个运算符重载,使vector也具有类似下标访问的能力,返回值是vector中存放元素类型的引用

对于[]的重载,在库里面支持了两种重载,分别是普通类型的和const类型的用于支持多样化的使用环境

怎么判断需要实现const或者非const版本?

  1. 对于只读接口,只实现const版本即可
  2. 对于只写接口,只实现非const版本即可
  3. 对于可读可写的接口,需要同时实现const版本和非const版本
void Test_Access()
{
  vector<int> v(10);
  for (size_t i = 0; i < v.size(); ++i)
  {
    v[i] = i;
  }
  for (size_t i = 0; i < v.size(); ++i)
  {
    cout << v[i] << " ";
  }
  cout << endl;
}

48684b469dbc8071782d5510d539c47e.png


6. 数据修改


1. 尾插尾删

1. push_back

4d2fb4e21bd86b031e84d3d9fe2e1037.png

尾插数据,插入前会进行扩容操作,每次扩容的大小取决于编译器的实现


2. pop_back

aaa4f0e642c45ce2e741cfa33283ae57.png

如果vector中有数据的话,尾删一个数据,否则会由assert中断程序或者抛出异常,具体情况取决于编译器的实现

void Test_Modifity()
{
  vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);
  v.push_back(5);
  v.pop_back();
  v.pop_back();
  v.pop_back();
  v.pop_back();
  v.pop_back();
  v.pop_back();
}

de55415a2d79826507f38d239deb5257.png

2.任意位置的插入删除

1. insert

38c2272598b5b7694772aaaa8d4e7cd5.png

在传入的任意位置插入一个数据或者迭代器区间的数据

2. erase

9f27591d98a762ad0675b2a53aa12055.png

删除任意位置的值或者任意一个迭代器区间的值

void Test_Modifity2()
{
  vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);
  v.push_back(5);
  v.insert(v.begin() + 3, 30);
  v.erase(v.begin());
    for (auto e : v)
  {
    cout << e << " ";
  }
  cout << endl;
}


e8a039cf9f5b8939c6e689575b13822e.png

这里注意一下,vector中会出现迭代器失效的问题

❗❗==vector中的迭代器失效问题==❗❗


❓第一个问题:迭代器的出现原因是什么?


✅迭代器的设计模式,为了不暴露底层实现细节,提供统一的方式来访问容器,对于vector,其迭代器本质上就是原生指针T*,所以对vector来说,迭代器失效的原因就是原迭代器指向的空间被销毁,导致出现野指针。


❓第二个问题:导致迭代器失效的操作有哪些?


✅迭代器失效的原理是底层空间改变,导致产生野指针,所以所有的底层空间的改变都有可能使迭代器失效,例如:reserve,resize,push_back,insert等。


✅除了对底层空间的改变之外,erase也会导致迭代器失效。


❓第三个问题:按照我们上一个问题的逻辑,erase没有使底层空间发生改变啊,为什么也会使迭代器失效?


✅虽然erase没有改变底层空间,但是,如果erase删除的是vector中最后一个元素,刚好删除完之后pos位置是end指向的位置,那么迭代器就失效了。


✅就算删除的不是最后一个元素,那么迭代器指向的位置的值也是改变了的,严格意义上来说,也是不能实现我们所需要的功能的,所以也可以认为是迭代器失效了。


❓第四个问题:只有vector会遇到迭代器失效的的情况吗,string有没有迭代器失效的情况?


✅不只是vector有,string和其他的容器都有迭代器失效的情况。


❓第五个问题:迭代器失效的问题怎么解决呢?


✅在上文中,我们讲解了vector的主要接口,可以注意到,能够引起迭代器失效的接口函数的返回值都是迭代器,这里返回的迭代器就是我们所需要的有效的迭代器。所以,在使用前对迭代器进行重新赋值即可解决。

//关于迭代器失效解决的例题:
//对于使用vector存储的数组{0,1,2,3,4,5,6,7,8,9},删除其中所有的偶数元素
int main()
{
  vector<int> v(10);
  for (size_t i = 0; i < 10; ++i)
  {
    v[i] = i;
  }
  vector<int>::iterator it = v.begin();
  while (it != v.end())
  {
    if (*it % 2 == 0)
    {
      it = v.erase(it);
    }
    else
    {
      ++it;
    }
  }
  for (auto e : v)
  {
    cout << e << " ";
  }
  cout << endl;
  return 0;
}


7.其他接口


1. clear

ed6f3cbe4c38b685b94f65a82f25e10f.png

删除vector内部所有数据(本质上做的操作就是将vector的size置为0)


2. swap

5589188e14413107ae5c7d8b43f6cf54.png

vector内部实现的一个交换函数,提升效率。

相关文章
|
5月前
|
存储 编译器 C++
【C++】vector介绍+模拟实现
【C++】vector介绍+模拟实现
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
66 4
|
18天前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
40 0
|
22天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
30 0
|
3月前
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
27 1
|
3月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
78 6
|
3月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
96 7
|
3月前
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
3月前
|
编译器 C语言 C++
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
【C++篇】解密 STL 动态之魂:全面掌握 C++ vector 的高效与优雅
63 3
|
3月前
|
C++
【C++】C++ STL探索:Vector使用与背后底层逻辑(三)
【C++】C++ STL探索:Vector使用与背后底层逻辑