vector容器介绍及基本API

本文详细介绍了C++标准模板库中的Vector容器。Vector是一种支持随机访问的动态数组,能够自动扩展存储空间。文章覆盖了Vector的基本概念、构造函数、赋值操作、大小调整、数据存取、插入和删除等关键API。

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

今天给大家带来的是一种STL容器,类似数组的一种C++容器——vector

进入主题:

什么是vector?

    vector是一种单口的容器,vector所指的内容是一片连续的空间,支持随机访问(Random Access),此外,vector容器的空间是动态增长的。vector功能基本如图1-1所示

图1-1

注意:

   所谓动态增加大小,并不是在原空间之后续接新空间(因为无法保证原空间之后尚有可配置的空间),而是一块更大的内存空间,然后将原数据拷贝新空间,并释放原空间。因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就都失效了。这是程序员容易犯的一个错误,务必小心。

 

下面介绍的是vector容器常用的API

 

 

vector构造函数

vector<T> v; //采用模板实现类实现,默认构造函数

vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身。

vector(size_type_Count,constvalue_type&_Val) //构造函数将_Count个_Val拷贝给本身。

vector(const vector&vec);//拷贝构造函数。

 

//例子 使用第二个构造函数 我们可以...

int arr[]= {2,3,4,1,9};

vector<int>v1(arr, arr + sizeof(arr)/ sizeof(int));

 


vector常用赋值操作

assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。

assign(n, elem);//将n个elem拷贝赋值给本身。

vector& operator=(const vector &vec);//重载等号操作符

swap(vec);// 将vec与本身的元素互换。

swap额外作用:压缩空间

vector<int>(v).swap(v);


vector大小操作

size();//返回容器中元素的个数

empty();//判断容器是否为空

resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

resize(int num,elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。

capacity();//容器的容量

reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。


vector数据存取操作

at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。

operator[];//返回索引idx所指的数据,越界时,运行直接报错

front();//返回容器中第一个数据元素

back();//返回容器中最后一个数据元素


vector插入和删除操作

insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.

push_back(ele); //尾部插入元素ele

pop_back();//删除最后一个元素

erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素

erase(const_iterator pos);//删除迭代器指向的元素

clear();//删除容器中所有元素

 

<think>好的,用户想要详细了解C++中的vector容器。首先,我需要回忆vector基本概念和它在STL中的位置。vector是动态数组,应该对比普通数组的优势,比如动态扩展大小、自动内存管理这些点。用户可能已经知道数组,所以重点要突出vector的不同之处。 接下来,用户可能需要知道如何实际使用vector,所以得包括头文件、初始化方法、常用操作这些内容。比如,如何声明一个vector,push_back、pop_back这些成员函数,还有访问元素的方法,比如用[]或者at()。要强调vector的随机访问特性,O(1)的时间复杂度。 然后,考虑到用户可能关心vector的性能,需要解释它的内存管理机制,比如容量和大小,reserve和resize的区别,以及插入元素时可能导致的重新分配和迭代器失效的问题。这部分可能比较复杂,需要用例子说明,比如当vector容量不足时,会重新分配更大的内存,复制元素,并释放旧内存,这样迭代器就会失效。 另外,用户可能想知道vector的适用场景,比如需要频繁随机访问、在尾部添加或删除元素,而不太适合在中间或头部插入删除的情况。这时候可以对比list或者其他容器,帮助用户理解何时选择vector更合适。 还要注意常见的问题,比如越界访问,虽然operator[]不检查边界,但at()会抛出异常,这一点需要提醒用户注意安全性。此外,C++11引入的emplace_back和移动语义可能也是值得提及的优化点。 最后,可能要给一个完整的代码示例,展示vector基本用法,从包含头文件到遍历元素,这样用户可以直观地看到如何在实际中使用vector。检查有没有遗漏的重要特性,比如swap方法、clear、empty等成员函数,或者C++17的新特性,比如emplace返回迭代器这些。 需要确保回答结构清晰,分点说明,并且语言简洁易懂,避免过于技术化的术语,但又要准确。同时,用户可能希望了解vector的底层实现机制,所以简要说明其动态数组的本质,以及内存增长的策略,比如每次扩容可能是翻倍,但具体实现可能不同。这样用户能理解为什么vector在尾部添加元素的平均时间复杂度是O(1)。 总结下来,回答应该涵盖定义、特性、基本操作、内存管理、性能特点、适用场景以及示例代码,同时指出注意事项和最佳实践。这样用户能够全面了解vector容器,并知道如何正确使用它。</think>以下是对C++ `vector` 容器的详细介绍,采用分步说明和示例演示: ### 一、基本定义 `vector` 是C++标准模板库(STL)中的序列容器,本质是动态数组: - 底层实现:连续内存空间存储元素 $$T* data$$ - 核心特性:自动管理内存,支持动态扩容 - 头文件:`#include <vector>` ### 二、核心特性 1. **动态扩展** - 初始容量自动分配(通常实现为0) - 当`size() == capacity()`时自动扩容(常见策略:容量翻倍) - 扩容时间复杂度:均摊$O(1)$ 2. **迭代器支持** ```cpp vector<int>::iterator it = vec.begin(); vector<int>::const_iterator cit = vec.cbegin(); ``` 3. **元素访问** ```cpp vec[0]; // 不检查越界(O(1)) vec.at(0); // 越界抛出out_of_range异常(O(1)) vec.front(); // 首元素 vec.back(); // 末元素 ``` ### 三、常用操作 #### 1. 初始化 ```cpp vector<int> vec1; // 空vector vector<int> vec2(5); // 5个0 vector<int> vec3(5, 10); // 5个10 vector<int> vec4{1,2,3}; // 初始化列表 vector<int> vec5(vec4.begin(), vec4.end()); // 迭代器范围 ``` #### 2. 增删元素 ```cpp vec.push_back(10); // 尾部插入(可能触发扩容) vec.emplace_back(10); // C++11更高效的构造插入 vec.pop_back(); // 删除尾部元素(O(1)) vec.insert(vec.begin()+2, 5); // 在指定位置插入(O(n)) vec.erase(vec.begin()+1); // 删除指定位置元素(O(n)) ``` #### 3. 容量控制 ```cpp vec.size(); // 实际元素数量 vec.capacity(); // 当前分配的内存容量 vec.empty(); // 判断是否为空 vec.reserve(100); // 预分配空间(避免多次扩容) vec.resize(10); // 修改元素数量 vec.shrink_to_fit();// 请求释放多余内存(非强制) ``` ### 四、内存特性 1. **内存连续性** ```cpp &vec[0] + i == &vec[i] // 保证地址连续性 ``` 2. **扩容规则** - 典型实现:新容量 = max(2*旧容量, 需求容量) - 扩容后所有迭代器、指针、引用失效 ### 五、复杂度分析 | 操作 | 时间复杂度 | |-------------------|------------| | 随机访问 | $O(1)$ | | 尾部插入/删除 | 均摊$O(1)$ | | 头部/中间插入删除 | $O(n)$ | ### 六、应用场景 - ✅ 需要随机访问元素 - ✅ 主要操作在序列尾部进行 - ✅ 需要内存连续性(如与C API交互) - ❌ 频繁在头部/中间插入删除(建议用`list`) ### 七、完整示例 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> nums = {2,3,4}; nums.insert(nums.begin(), 1); // 头部插入 nums.reserve(10); // 预分配空间 nums.push_back(5); // 遍历方式 for(auto& num : nums) { // 范围for循环 std::cout << num << " "; } return 0; } ``` 输出结果:`1 2 3 4 5` ### 八、注意事项 1. 插入/删除操作可能导致迭代器失效 2. `operator[]`不检查越界,`at()`更安全但性能略低 3. C++11起支持移动语义,可高效转移资源 4. 与数组互操作: ```cpp int arr[5]; std::vector<int> vec(arr, arr+5); // 数组转vector ``` 通过合理使用`vector`,可以显著提升开发效率,但需注意其扩容机制带来的性能影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值