✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨
✨个人主页:余辉zmh–CSDN博客
✨文章所属专栏:c++篇–CSDN博客
文章目录
- 前言
- 一.vector的基本概念
- 1.定义
- 2.主要特性和优点
- 二.vector的基本操作和使用
- 1.创建`vector`对象
- 2.元素访问和迭代器
- 元素访问
- 迭代器
- 3.大小和容量
- 4.修改元素
- 插入函数
- 删除函数
前言
在C++的庞大标准模板库(STL)中,std::vector
无疑是最为常用且功能强大的容器之一。它以其高效的内存管理和灵活的动态数组特性,成为了程序员们处理数据的首选工具。无论是初学者还是资深开发者,std::vector
都是他们日常编程工作中不可或缺的一部分。在这篇文章中,我们将深入探讨std::vector
的基本操作和使用方法。我们将从std::vector
的创建和初始化开始,逐步学习如何向std::vector
中添加元素、删除元素、访问元素以及进行其他常见操作。希望这篇文章对你的学习有所帮助。
一.vector的基本概念
1.定义
vector
是一个能存储任意类型对象的序列容器,这些对象在容器中有序存储,也就是说,vector
底层就是顺序表。它允许在序列的末尾快速的增加或删除元素,并支持通过索引直接访问任意位置的元素。vector
是模版类,可以存储任意类型的对象,包括自定义类型。
2.主要特性和优点
在C语言中,对于顺序表的处理大多都是使用数组,而c++中则是可以通过使用vector容器达到顺序存储的目的,相较于数组来说,vector
使用起来会更加方便。下面将会通过对比传统数组来讲解vector的主要特性和优点。
-
大小调整:普通数组在声明时需要指定固定的大小,且大小在声明后不可改变。而vector是一种动态数组,它可以根据需要自动调整大小,不需要预先指定固定大小。
-
内存管理:数组内数据通常存储在栈上,需要手动管理内存空间,包括分配和释放,容易引发内存泄漏或者野指针等问题。而vector中数据存储在堆上,它自动处理内存的分配和释放,减少了内存管理方面的错误。
-
边界检查:直接使用数组时,程序员需要自己负责确保索引不会越界,否则会导致未定义行为。虽然vector没有内置的边界检查机制,但可以通过迭代器和成员函数如at()进行安全访问。
-
**操作方式:**使用数组时,对于数据的处理通常需要我们自己来手写函数操作,而
vector
提供了丰富的成员函数,如push_back()
,insert()
,erase()
,size()
,capacity()
等函数,这些函数使用我们对vector
的操作标的非常灵活和方便。
二.vector的基本操作和使用
1.创建vector
对象
-
默认构造函数:
创建一个空的
vector
对象vector<int> v1;
-
填充构造函数:
-
创建一个指定数量元素的vector对象,每个元素默认值为0
-
//创建一个包含5个整数的vector,每个整数都为0 vector<int> v2(5);
-
创建一个指定数量和指定数值的vector对象
-
//指定个数为5,指定数值为10 vector<int> v3(5,10);
-
-
列表初始化:
使用初始化列表创建和初始化vector对象
vector<int> v4={1,2,3,4};
-
复制构造函数:
-
使用一个已经存在的vector对象拷贝构造一个新的vector对象
-
vector<int> v4={1,2,3,4}; vector<int> v5(v4);
-
将一个已经存在的vector对象赋值给另一个已存在的对象
-
vector<int> v4={1,2,3,4}; vector<int> v6; v6=v4;
-
-
使用迭代器范围初始化:
-
使用另一个容器(数组或vector对象)的迭代器范围来初始化vector对象
-
使用数组:
int array[]={1,2,3,4,5}; vector<int> v7(array,array+5);
-
使用vector:
vector<int> v4={1,2,3,4,5}; vector<int> v8(v4.begin(),v4.end());
-
-
二维vector的创建:
vector<vector<int>> vv; //初始化第一维,大小为5 vv.resize(5); //初始化第二维,每个元素大小为5 for(size_t i=0;i<vv.size();i++){ vv[i].resize(5); }
2.元素访问和迭代器
元素访问
和string一样,同样可以使用下标+[]和at()函数。
-
下标操作符
[]
:-
不进行边界检查,如果访问越界,在debug版本中会触发assert错误,在release版本中可能不会检查错误,导致未定义行为。
-
示例代码:
vector<int> v1={1,2,3,4,5}; //访问下标为2的元素 int val=v1[2];
-
-
at()
函数:-
与下标操作符不同,
at()
函数会进行边界检查,如果访问越界,会抛出std::out_of_range
异常。 -
示例代码:
vector<int> v2={1,2,3,4,5}; //访问下标为3的元素 int val=v2.at(3);
-
迭代器
和string
一样,vector
的迭代器同样可以访问和遍历容器中元素。迭代器实质上是一个指向容器中元素的指针,但它比普通的指针更加通用和灵活。
-
获取迭代器:
-
通过调用
vector
的成员函数begin()
和end()
,可以获取指向容器第一个元素和最后一个元素之后位置的迭代器。 -
示例代码:
vector<int> v1={1,2,3,4,5}; //获取begin位置的迭代器 vector<int>::iterator it=v1.begin(); //获取end位置的迭代器 vector<int>::iterator rit=v1.end();
-
-
使用迭代器访问元素:
-
通过解引用迭代器(使用
*
操作符),可以访问迭代器指向的元素。 -
示例代码:
vector<int> v1={1,2,3,4,5}; //获取begin位置的迭代器 vector<int>::iterator it=v1.begin(); //获取end位置的迭代器 vector<int>::iterator rit=v1.end(); int val1=*it; int val2=*(rit-1);
-
-
遍历容器:
-
通过递增迭代器(使用
++
操作符),可以遍历整个容器。 -
示例代码:
vector<int> v1={1,2,3,4,5}; vector<int>::iterator it=v1.begin(); while(it!=v1.end()){ cout<<*it<<" "; it++; } //输出结果:1 2 3 4 5
-
3.大小和容量
-
大小和容量:
-
size()
:返回vector对象有效长度(也就是顺序表存储的个数个数)capacity()
:返回当前分配的存储空间的大小(空间总大小),这个值可能大于或等于size()
返回的值。 -
实例代码:
vector<int> v1={1,2,3,4,5}; //输出对象v1的大小和容量 cout<<v1.size()<<" "<<v1.capacity()<<endl;
-
-
扩容:
-
reserve(n)
:如果n大于原容量,更改容量(capacity)为n,小于原本容量时,保持不变,该函数不会改变原本的大小(size),只是确保有足够的空间来存储至少n个元素。 -
实例代码:
vector<int> v1={1,2,3,4,5}; //将v1的容量扩为5 v1.resize(10);
-
resize(n)
:将vector对象的大小调整为n,如果n大于当前的大小,则用默认元素(通常为0,如果使用reserve(n,m)
则是元素m
)填充新位置;如果n小于当前vector对象的大小,则发生截断。 -
实例代码:
vector<int>v1={1,2,3,4,5,6,7,8}; //将v1的容量扩大为15,新的空间用数值100填充 //v1:1,2,3,4,5,6,7,8,100,100,100,100,100,100,100 v1.resize(15,100); //将v1的容量缩小为5,发生截断 //v1:1,2,3,4,5
-
4.修改元素
在C++标准库中的vector
是一个动态数组,它允许在运行时进行元素的插入和删除。以下是一些常用的插入和删除函数及其用法:
插入函数
-
push_back
-
功能:在容器的末尾添加一个元素。
-
用法:
void push_back (const value_type& val)
-
示例:
vector<int> v; //v中增加元素10 v.push_back(10);
-
-
insert
-
功能:在指定位置插入一个或多个元素。
-
用法:
-
示例:
vector<int> vec = {1, 2, 4}; // 在位置2插入3 vec.insert(vec.begin() + 2, 3); //vec:1,2,3,4 vector<int> more = {5, 6}; // 在末尾插入more中的所有元素 vec.insert(vec.end(), more.begin(), more.end()); //vec:1,2,3,4,5,6
-
删除函数
-
erase
-
功能:删除指定位置的元素或删除指定范围内的元素。
-
用法:
-
示例:
std::vector<int> vec = {1, 2, 3, 4, 5}; // 删除位置2的元素(值为3) vec.erase(vec.begin() + 2); //vec:1,2,4,5 // 删除前两个元素 vec.erase(vec.begin(), vec.begin() + 2); //vec:4,5
-
-
clear
- 功能:删除容器中的所有元素,使容器变为空。
- 用法:
void clear();
- 示例:
vector<int> vec = {1, 2, 3, 4, 5}; // 删除所有元素 vec.clear(); //vec:空
-
pop_back
- 功能:删除容器末尾的元素。
- 用法:
void pop_back();
- 示例:
vector<int> vec = {1, 2, 3}; // 删除末尾元素(值为3) vec.pop_back(); //vec:1,2
这些函数提供了灵活的方式来管理vector
中的元素,允许在运行时动态地添加和删除元素。
以上就是关于如何熟练使用vector的讲解,本篇文章主要是简单地认识一下vector,在下一篇模拟实现vector中将会重点对vector进行讲解。最后本篇文章如果哪里有错的话,可以在评论区指正,也欢迎大家一起讨论学习,如果对你的学习有帮助的话,点点赞关注支持一下吧!!!