c++头文件之Vector(Vector的用法)

本文详细介绍了C++中Vector的定义、优缺点、初始化方式、访问元素的方法、增删操作、获取长度、其他功能以及常用算法。Vector作为动态数组的封装,提供了一种更易用的数组操作方式,但要注意其扩容机制可能带来的性能影响。通过实例代码展示了如何使用Vector,并提及了头文件<algorithm>中与Vector相关的排序、反转、复制和查找等算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++头文件之Vector

开始学习c++,再这个过程中第一个令人头疼的地方就是头文件的含义了,c++头文件的内容会随着我的深入学习进行更新.
首先,我们需要该清楚Vector的定义: C++标准库提供了被封装的动态数组——Vector。大体上讲,就是更容易上手的动态数组.让我们看看Vector的优缺点.
优点:
1). Vector可以存放任意类型的数据
2). 容量可以自动扩展
3). 初始化形式简单,多样
4). 可以插入或删除元素
5). 可以获取数组的长度(是否为空)
6). 也是通过下标来访问的
7). 能够一下清除所有数据
8). 强制调整数组元素的个数以及数值
9). 将数组的容量进行人为的扩大
10). 将两个Vector数组的值进行整体性交换

缺点: Vector的操作简单,容易上手,是数组的"升级版",但是Vector的每次自动扩容都是增加当前空间的50%(第一次除外);会消耗大量的空间与时间,所以小数据使用Vector还是很高效的.

使用步骤:

(1) 加入头文件

代码如下(示例):

#include<vector>

using namespace std;

(2) Vector数组的初始化

代码如下(示例):

//1. 直接赋值
   vector <int> A1 {1,2,3,4,5};               //一维
   vector <vector <int>> A2 {{1,2,3},{1,2,3}};//二维
   
//2. 不带参数构造
   vector <int> A1;//空的数组,长度为0(size()为0)可以用push_back(elem)输入元素
   
//3. 带参数构造
   vector <int> A2(10);  //10个数据全为0
   vector <int> A3(10,1);//10个数据全为1
   
//4. 通过同类型的vector初始化
   vector <int> A1(5,1);
   vector <int> A2(A1);  //通过A1来初始化A2

(3) 访问

3.1 通过地址访问

代码如下(示例):

   ///通过地址访问
   vector<int> A1 {1,2,3,4,5};        //一维
   vector<int>::iterator k=A1.begin();//返回第一个元素的地址
   cout<<*k<<endl;     //输出1
   cout<<*(k+1)<<endl; //输出2
   vector<int>::iterator k=A1.end();  //返回最后一个元素的下一位地址
   cout<<*(k-1)<<endl; //输出5
   

3.2 通过下标访问

代码如下(示例):

 ///通过下标访问
   vector<int> A1 {1,2,3,4,5}; //一维
   cout<<A1.at(0)<<endl;       //输出为1
   

(4) 增,删

4.1 插入,删除(栈顶)

代码如下(示例):

 ///添加,删除
   A.pop_back();      //删除最后一个元素
   A.push_back(elem); //在尾部添加一个元素

4.2 特定位置插入删除

代码如下(示例):

///特定位置插入删除
   vector<int> A1 {1,2,3,4,5};        //一维
   vector<int>::iterator k=A1.begin();//下标从0开始
   A1.insert(k+1,9);                  //A1={1,9,2,3,4,5}
   A1.erase(k+1);                     //A1={1,3,4,5}

(5) 获取数组的长度

代码如下(示例):

///获取长度或者判断数组是否为空
   vector<int> A1 {1,2,3,4,5};//一维
   cout<<A1.size()<<endl;//输出5
   cout<<A1.empty()<<endl;//输出0

(6) 其他用法

代码如下(示例):

///返回可用总元素
    A.capacity(); //返回A在内存中总共可以容纳的元素个数
    
///强制调整元素个数以及数值    
    A.resize(10); //将A的现有元素个数调至10个,多则删,少则补,其值随机    
    A.resize(10,2); //将A的现有元素个数调至10个,多则删,少则补,其值为2
    
///将数组扩容    
    A.reserve(100); //将A的容量(capacity)扩充至100,也就是说现在测试A.capacity();的时候返回值是100.这种操作只有在需要给A添加大量数据的时候才         显得有意义,因为这将避免内存多次容量扩充操作(当A的容量不足时电脑会自动扩容,当然这必然降低性能) 
    
///将Vector数组A,B的元素进行整体交换   
    A.swap(B); //B为向量,将A中的元素和B中的元素进行整体性交换

(7)几种重要的算法,使用时需要包含头文件:

#include < algorithm >

代码如下(示例):

#include<algorithm>1sort( A.begin() , A.end() ); //对a中的从A.begin()(包括它)到A.end()(不包括它)的元素进行从小到大排列2reverse(A.begin(),A.end()); //对A中的从A.begin()(包括它)到A.end()(不包括它)的元素倒置,但不排列,如A中元素为1,3,2,4,倒置后为4,2,3,13copy(A.begin(),A.end(),B.begin()+1); //把A中的从A.begin()(包括它)到A.end()(不包括它)的元素复制到B中,从B.begin()+1的位置(包括它)开始复制,覆盖掉原有元素4find(A.begin(),A.end(),10); //在A中的从A.begin()(包括它)到A.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
  
### C++ `vector` 头文件使用方法和功能介绍 #### 容器概述 `vector` 是标准模板库(STL)中的一个序列容器,支持动态数组的功能。这使得它能够像静态数组一样随机访问元素的同时还具备自动调整大小的能力。 #### 声明与初始化 可以利用多种方式来创建并初始化一个 `vector` 对象: - 默认构造函数会建立一个空的向量对象。 ```cpp std::vector<int> v; ``` - 利用两个迭代器指定范围内的元素作为初始值构建一个新的向量实例[^1]。 ```cpp std::vector<int> v(anotherVector.begin(), anotherVector.end()); ``` - 通过给定数量以及重复填充特定数值的方式来进行初始化。 ```cpp std::vector<int> v(10, 42); // 创建含有十个整数42的向量 ``` - 拷贝已存在的另一个同类型向量的内容到新定义的对象里去。 ```cpp std::vector<int> original = {1, 2, 3}; std::vector<int> copy(original); ``` #### 添加元素 为了在现有基础上增加新的成员项,可采用如下几种手段之一: ```cpp // 向末端追加单个元素 v.push_back(value); // 插入多个相同值的新条目至结尾处 v.assign(count, value); // 把其他集合里的全部组件搬移到当前列表内 anotherContainer.insert(anotherContainer.end(), beginIterator, endIterator); ``` #### 获取尺寸信息 想要了解目前存储了多少有效数据,则可以通过调用 `.size()` 方法得到返回的结果;如果想知道分配的空间能否容纳更多项目而不必重新配置内存的话,那么应该查询其容量属性即`.capacity()`. ```cpp if (v.capacity() >= requiredCapacity && v.size() < maxSize){ // 可以安全地继续添加元素而不会触发再分配 } ``` #### 随机存取 由于实现了连续性的内部结构布局特性,所以允许直接按照索引位置快速定位目标记录,并对其进行读写操作。 ```cpp int firstElement = v.front(); // 返回首个元素引用 int lastElement = v.back(); // 返回最后一个元素引用 for(size_t i=0;i<v.size();++i){ // 迭代整个序列 int currentVal=v.at(i); // 或者使用下标运算符[] } ``` #### 删除动作 当不再需要某些部分的数据时,可以选择移除它们: ```cpp v.pop_back(); // 移走最后面的一项 auto it = find(v.begin(), v.end(), targetValue); if(it != v.end()){ v.erase(it); // 根据找到的位置擦掉对应节点 } // 清理所有保存下来的资料 v.clear(); ``` #### 数据交换 有时候可能希望将两个不同变量所指向的实际内容相互替换过来,这时就可以借助于swap成员函数轻松完成这项工作. ```cpp firstVec.swap(secondVec); // 等价表达形式 using std::swap; swap(firstVec, secondVec); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值