文章目录
1.vector容器
std::vector
是C++标准模板库(STL)中的一个动态数组容器,其内部实现基于动态内存分配,能够自动调整大小。
-
动态大小:
vector
容器能够在运行时动态地增加或减少其容量以适应元素的数量变化,无需程序员显式地管理内存。 -
连续内存: 虽然可以动态调整大小,但
vector
中的元素在内存中是连续存储的,这使得它支持快速随机访问,类似于传统的数组。 -
容量与尺寸:
- 容量(capacity): 容量是指
vector
当前所分配的内存空间能容纳的元素最大数量,即使这些位置可能尚未被使用。 - 大小(size): 大小是指
vector
当前实际存储的元素数量。
- 容量(capacity): 容量是指
-
自动扩展: 当向
vector
添加元素导致当前容量不足以容纳新元素时,vector
会自动重新分配内存,通常是原容量的一定倍数(例如,常见实现会加倍现有容量),以减少频繁的内存重分配。 -
高效操作:
- 在尾部插入和删除元素的操作非常高效。
- 使用索引或
at()
方法可以快速访问元素,时间复杂度为O(1)。 - 插入或删除非尾部元素可能需要移动后续元素,因此操作成本较高。
-
迭代器:
vector
提供了随机访问迭代器,允许类似指针的操作,可以进行高效的遍历和元素访问。 -
构造与初始化:
vector
可以通过默认构造函数、指定大小的构造函数、区间构造函数或使用初始化列表等方式进行构造和初始化。 -
内存管理:
vector
负责其内部元素的内存管理,包括分配和释放,减轻了程序员的负担,但这也意味着在插入和删除操作中可能会有性能开销,尤其是在需要重新分配内存时。
vector
结合了数组的高效访问特性和动态数组的灵活性,是处理可变数量序列数据时的常用选择。
1.vector容器构造函数
/* * vector<T> v;//采用模板实现类实现,默认构造函数 * vector(v.begin(),v.end());//将v[begin(),end()]区间的元素拷贝给本身 * vector(n,elem); //构造函数将n个elem拷贝给本身 * vector(const vector &vec); //拷贝构造函数 */
示例:
#include <iostream>
#include "vector"
using namespace std;
int main(){
vector<int> v;
v.reserve(10);
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
for (int & it : v){
cout << it << " ";
}
cout << endl;
vector<int>v1(v.begin(),v.end());
for (int &it : v1){
cout << it << " ";
}
cout << endl;
vector<int>v3(10,100);
for (int &it : v3){
cout << it << " ";
}
cout << endl;
vector<int>v4(v3);
for (int &it : v4) {
cout << it << " ";
}
return 0;
}
2.vector容器的赋值操作
/* * vector& operator=(const vector &vec);//重载等号操作符 * assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身, * assign(n, elem);//将n个elem拷贝赋值给本身。 */
示例:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int>v;
v.push_back(10);
v.push_back(20);
vector<int>v1;
v1 = v;
for (int &it : v1){
cout << it << " ";
}
cout << endl;
vector<int>v2;
v2.assign(v.begin(), v.end());
for(int &it : v2){
cout << it << " ";
}
cout << endl;
v2.assign(10,100);
for(int &it : v2){
cout << it << " ";
}
return 0;
}
3.vector容器的容量和大小
empty();//判断容器是否为空 capacity();//容器的容量 size();//返回容器中元素的个数 resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。 //如果容器变短,则末尾超出容器长度的元素被删除。 resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置 //如果容器变短,则未尾超出容器长度的元素被删除
示例:
#include <iostream>
#include "vector"
using namespace std;
int main(){
vector<int>v;
if (v.empty()){
cout << "Nothing" << endl;
}
v.push_back(10);
cout << v.size() << endl;
v.reserve(5); // 只扩充容量 不填充值 预先为vec分配至少能容纳5个元素的内存空间
v.resize(5);
for(int &it : v){
cout << it << endl;
}
cout << v.size() << endl;
cout << v.capacity() << endl;
v.reserve(10);
v.resize(10,10); //扩充部分填充10
cout << v.size() << endl;
cout << v.capacity() << endl;
return 0;
}
4.vector容器的插入和删除
push back(ele);//尾部插入元素ele pop_back();//删除最后一个元素 insert(const iterator pos,ele);//迭代器指向位置pos插入元素ele erase(const iterator pos);//删除迭代器指向的元素 insert(const_iterator pos,int count,ele);//迭代器指向位置pos插入count个元素ele erase(const iterator start,const iterator end);//删除迭代器从start到end之间的元素 clear();//删除容器中所有元素
示例:
#include <iostream>
using namespace std;
#include "vector"
int main(){
vector<int>v;
v.push_back(10);
v.push_back(20);
for(int &it : v){
cout << it << " ";
}
cout << endl;
v.pop_back();
v.insert(v.begin(),5);
for(int &it : v){
cout << it << " ";
}
cout << endl;
v.insert(v.begin(),101);
for(int &it : v){
cout << it << " ";
}
cout << endl;
v.erase(v.begin());
for(int &it : v){
cout << it << " ";
}
cout << endl;
v.erase(v.begin(), v.end());
for(int &it : v){
cout << it << " ";
}
cout << endl;
v.clear();
for(int &it : v){
cout << it << " ";
}
return 0;
}
5.vector容器的数据存取
at(int idx);//返回索引idx所指的数据 operator[];//返回索引idx所指的数据 front();//返回容器中第一个数据元素 back();//返回容器中最后一个数据元素
示例:
#include <iostream>
#include "vector"
using namespace std;
int main(){
vector<int>v;
v.reserve(10);
for(int i = 0;i < 10;++i){
v.push_back(i);
}
cout << v.at(0) << endl;
cout << v[1] << endl;
cout << v.front() << endl;
cout << v.back() << endl;
return 0;
}
6.vector容器互换容器
swap(vec);//将容器vec与自身互换
示例:
#include <iostream>
#include "vector"
using namespace std;
int main() {
vector<int> v;
v.reserve(10);
for (int i = 0; i < 10; ++i) {
v.push_back(i);
}
vector<int>v1;
v1.swap(v);
for(int &it : v1){
cout << it << " ";
}
//使用swap收缩内存
//vector<int>(v).swap(v); //创建匿名对象以v的大小初始化,互换两个容器,匿名对象在当前行执行完毕后,内存被回收
return 0;
}
7.vector容器预留空间
在C++的STL中,std::vector
容器的reserve
方法用于预先为容器分配内存空间,但不初始化元素,也不改变容器中元素的数量。这个方法的主要目的是为了优化性能,特别是当你已经知道或者可以预测到容器未来需要容纳多少元素时,通过提前分配足够的内存,可以减少在插入元素过程中因自动扩容而引起的内存重新分配和数据迁移次数。
-
功能:
reserve
函数允许你设定容器的容量(capacity)。也就是说,它保证了在不做进一步内存重新分配的情况下,容器至少可以容纳指定数量的元素。 -
参数:它接受一个参数,即你希望预留的未初始化元素的个数。这个参数应该是非负的,如果小于当前容量,则调用不会有任何效果。
-
不影响元素:调用
reserve
不会改变容器中已有元素的数量,也不会影响已有元素的值。 -
性能优势:通过预先分配内存,可以避免在多次插入操作中频繁地重新分配和复制数据,这对于性能敏感的应用特别重要。特别是在循环中添加大量元素时,先调用一次
reserve
可以显著提升效率。 -
不初始化元素:与
resize
不同,reserve
不会修改容器的实际大小(即元素数量),也不会对新分配的内存区域中的元素进行初始化。 -
示例用法:
std::vector<int> vec; vec.reserve(100); // 预先为vec分配至少能容纳100个元素的内存空间
reserve
是一种优化手段,帮助程序减少运行时的内存管理和分配开销,特别是在明确知道所需内存大小的情况下。