对vector的理解

这篇博客介绍了C++中的vector,它是一个动态数组,支持随机访问且能存放任意类型对象。文章详细阐述了vector的基本操作,如构造、添加、删除元素以及遍历方法,包括push_back()、insert()、erase()、clear()、pop_back()和size()等成员函数的使用。

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

vector介绍

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。vector随机访问的复杂度是O(1),插入数据的复杂度是 O(n)。对vector遍历通常有两种方式:通过下标、利用迭代器。

vector该怎么用?

定义和对应的输入、访问某一数据和删除vector:
C++ Vectors可以使用以下任意一种参数方式构造:

1、无参数 - 构造一个空的vector

#include <iostream>
#include<vector>
using namespace std;
int main()
{
    //1、定义了一个空的vector "v"
    vector<int> v;
    for (int i=0;i<5;i++){
        v.push_back(i);//
    }
    int m=v.at(3); //当我想输出7(并不存在)时,编译器会报错。
    cout<<m<<endl;
    for(int i=1;i!=v.size();i++)//这里我用codeblocks他会出waring,但如果我把int换成vector<int>::size_type,就不会报,因为size_type 相当于 unsigned int类型,使用size_type 主要是为了适应不同的平台,int 类型大小会根据不同平台而不同
        cout<<v[i]<<" ";
    return 0;
}

2、数量(num)和值(val) - 构造一个初始放入num个值为val的元素的Vector

#include <iostream>
#include<vector>
using namespace std;
int main()
{
    //第二种定义方法
    vector<int> v(5,3);//构造5个值为3
    int m=v.at(3); //当我想输出7(并不存在)时,编译器会报错。
    cout<<m<<endl;
    for(int i=1;i!=v.size();i++)
        cout<<v[i]<<" ";
    return 0;
}

3、vector(from) - 构造一个与vector from 相同的vector
4、迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).(这两个不太懂,以后遇见补上)

vector添加数据的方法有两种:

1、一种是在尾部添加元素,使用的函数是push_back()函数:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
    //1、定义了一个空的vector "v"
    vector<int> v;
    for (int i=0;i<5;i++){
        v.push_back(i);//
    }
    int m=v.at(3); //当我想输出7(并不存在)时,编译器会报错。
    cout<<m<<endl;
    for(int i=1;i!=v.size();i++)//这里我用codeblocks他会出waring,但如果我把int换成vector<int>::size_type,就不会报,因为size_type 相当于 unsigned int类型,使用size_type 主要是为了适应不同的平台,int 类型大小会根据不同平台而不同
        cout<<v[i]<<" ";
    return 0;
}

2、另一种是在指定位置插入元素,使用到的函数是insert()函数。

#include <iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v;
    v.insert(v.begin(),10);//在开始之前,插入10
    for (vector<int>::size_type i=1;i<5;i++){
        v.push_back(i);
    }
    for(vector<int>::size_type i=0;i!=v.size();i++)
        cout<<v[i]<<" ";
    return 0;
}

用迭代器在数据之间插入数据:

#include <iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v;
    for (vector<int>::size_type i=1;i<5;i++){
        v.push_back(i);
    }
    vector<int>::iterator t;
    for(t=v.begin();t!=v.end();t++){
        if(*t==3)
        {v.insert(t,9);//在3之前,插入10
        break;} //找到了一定要break;否则会死循环
    }
    for(vector<int>::size_type i=0;i!=v.size();i++)
        cout<<v[i]<<" ";
    return 0;
}

还可以用erase()删除某一元素

#include <iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> v;
    for (vector<int>::size_type i=1;i<5;i++){
        v.push_back(i);
    }
    vector<int>::iterator t;
    for(t=v.begin();t!=v.end();t++){
        if(*t==3)
        {v.erase(t);//删除第三个数
        break;} //找到了一定要break;否则会死循环
    }
    for(vector<int>::size_type i=0;i!=v.size();i++)
        cout<<v[i]<<" ";
    return 0;
}

还有clear(),清空vector中的所有元素。
pop_back(),删除末尾的元素。
size(),返回的是vector的大小。等等…

<think>好的,用户之前问了如何学习STL来应对蓝桥杯,现在又问“vector怎么理解”。我需要详细解释vector的概念和用法,但要注意用户可能已经有了一些基础,或者在之前的回答中已经提到了vector的重要性。 首先,用户可能是在学习过程中遇到了vector,需要更深入的理解。他们可能已经知道vector是动态数组,但需要更系统化的知识,比如内部实现、常用操作、注意事项等。 接下来,我要考虑用户的需求。他们可能希望了解vector的基本概念、常用方法,以及在算法竞赛中的实际应用。同时,用户可能对性能问题(如时间复杂度)和常见错误(如迭代器失效)感兴趣,因为这些在比赛中很关键。 需要组织内容的结构。先从基本定义开始,说明vector的作用和优点。然后比较vector和普通数组的区别,突出其动态扩容的特性。接着讲解常用操作,包括初始化、增删改查、遍历等,最好用代码示例说明。然后讨论性能问题,比如不同操作的时间复杂度,以及扩容机制。还要提到注意事项,比如迭代器失效的情况,如何避免,以及常见的使用技巧,比如预分配空间来优化性能。 用户可能还有更深层的需求,比如如何高效使用vector来解决算法题,或者如何避免常见的错误导致失分。因此,实际应用场景的例子会有帮助,比如在BFS中使用vector作为邻接表,或者处理动态数组时的排序和查找。 最后,总结一下vector的重要性,并鼓励用户多练习,结合之前的STL学习路径,巩固知识。可能还需要提醒用户参考之前提到的资源,比如刷题平台和书籍,来加强学习效果。</think>在 C++ 中,`vector` 是最重要且最常用的 **动态数组容器**,可以理解为会自动扩容的智能数组。它在算法竞赛和实际开发中几乎无处不在,下面用程序员最易懂的方式分层解析: --- ### **一、底层本质** - **物理结构**:连续内存空间(类似普通数组) - **核心特性**:动态扩容(容量不足时自动申请更大内存并拷贝数据) - **时间复杂度**: - 随机访问:`O(1)`(支持 `v[i]` 直接访问) - 尾部插入/删除:均摊 `O(1)` - 中间插入/删除:`O(n)`(需要移动后续元素) --- ### **二、与普通数组的对比** | **特性** | 普通数组 `int arr[10]` | `vector<int> v` | |--|-------------------------------| | 内存管理 | 手动分配/释放 | 自动管理 | | 大小固定 | 编译时确定 | 运行时动态变化 | | 越界访问 | 不检查(可能崩溃) | `v.at(i)` 会抛异常(更安全) | | 功能扩展 | 无 | 自带排序、查找等算法支持 | --- ### **三、核心操作速查** #### 1. 初始化 ```cpp vector<int> v1; // 空vector vector<int> v2(5, 100); // 5个100 → {100,100,100,100,100} vector<int> v3 = {2,4,6,8}; // 列表初始化(C++11) ``` #### 2. 增删改查 ```cpp v.push_back(10); // 尾部插入 → O(1) v.pop_back(); // 尾部删除 → O(1) v.insert(v.begin()+2, 20); // 在索引2处插入 → O(n) v.erase(v.begin()+1); // 删除索引1元素 → O(n) v[3] = 50; // 直接修改 → 类似数组(不检查越界!) v.at(3) = 50; // 会检查越界的访问 ``` #### 3. 容量控制 ```cpp v.reserve(100); // 预分配容量(避免频繁扩容)★ 性能关键! v.resize(10); // 强制修改大小为10(多删少补默认值) v.shrink_to_fit(); // 释放多余容量(C++11) ``` #### 4. 信息获取 ```cpp int size = v.size(); // 实际元素个数 int cap = v.capacity(); // 当前总容量(≥size) bool isEmpty = v.empty();// 判空 ``` --- ### **四、性能优化技巧** #### 1. **预分配空间**(避免反复扩容) ```cpp vector<int> v; v.reserve(1000); // 提前预留空间 → 减少扩容时的拷贝开销 for(int i=0; i<1000; i++) v.push_back(i); ``` #### 2. **巧用 swap 释放内存** ```cpp vector<int> v(1000000); v.clear(); // 清空元素,但容量不变(内存未释放) vector<int>().swap(v); // 强制释放内存(容量变为0) ``` #### 3. **移动语义(C++11)** ```cpp vector<string> createBigData() { vector<string> tmp(1000000); return tmp; // 通过移动而非拷贝返回(效率飞跃) } ``` --- ### **五、算法竞赛经典用法** #### 1. 邻接表存图(替代链表) ```cpp vector<vector<int>> graph(N); // 每个节点的邻接点列表 // 添加边 a→b graph[a].push_back(b); ``` #### 2. 动态二维数组 ```cpp vector<vector<int>> matrix(m, vector<int>(n)); // m行n列 ``` #### 3. 配合算法使用 ```cpp sort(v.begin(), v.end()); // 排序 auto it = lower_bound(v.begin(), v.end(), x); // 二分查找 reverse(v.begin(), v.end()); // 反转 ``` -- ### **六、避坑指南** 1. **迭代器失效** ```cpp vector<int> v = {1,2,3}; auto it = v.begin(); v.push_back(4); // 可能导致迭代器失效! // 正确做法:操作后重新获取迭代器 ``` 2. **越界访问** ```cpp vector<int> v(3); cout << v[5]; // 未定义行为(可能崩溃) cout << v.at(5); // 抛出 std::out_of_range 异常 ``` 3. **效率陷阱** ```cpp // 错误示范:频繁头部插入 for(int i=0; i<10000; i++) v.insert(v.begin(), i); // O(n²) 时间! // 改用 deque 更高效 ``` --- ### **七、一句话总结** **vector = 数组的便捷性 + 链表的动态性 + 智能的内存管理**,是算法竞赛中存储动态数据的首选容器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值