C++提高编程 3 STL常用容器 -vector容器
3.2 vector容器
3.2.1 vector基本概念
功能:vector数据结构和数组非常相似,也称为单端数组;
vector与普通数组区别:数组是静态空间,而vector是可以动态扩展的。
动态扩展:
并不是在原有空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间
vector容器的迭代器是支持随机访问的迭代器
3.2.1 vector基本概念
功能描述:
创建vector容器
函数原型: 注意第二个点!!是前闭后开的!!
#include<iostream> using namespace std; #include<vector> void printVector(vector<int>&v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { vector<int>v1; //默认构造 无参构造 for (int i = 0; i < 10; i++) { v1.push_back(i); } printVector(v1); //通过区间构造 vector<int>v2(v1.begin(), v1.end()); printVector(v2); //n个elem方式构造 vector<int>v3(10, 100); //第一个参数是个数,第二个是初值 printVector(v3); //拷贝构造 vector<int>v4(v3); printVector(v4); } int main() { test1(); system("pause"); return 0; }
3.2.3 vector赋值操作
功能描述:给vector容器进行赋值
函数原型:
vector& operator=(const vector& vec); //重载等号操作符
assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身
assifn(n,elem); //将n个elem拷贝赋值给本身
#include<iostream> using namespace std; #include<vector> void printVector(vector<int>&v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { vector<int>v1; //默认构造 无参构造 for (int i = 0; i < 10; i++) { v1.push_back(i); } printVector(v1); //赋值 operator= vector<int>v2; v2 = v1; printVector(v2); //assign vector<int>v3; v3.assign(v1.begin(), v1.end()); printVector(v3); vector<int>v4; v4.assign(10, 1000); printVector(v4); } int main() { test1(); system("pause"); return 0; }
3.2.4 vector容量和大小
功能描述:
对vector容器的容量和大小操作
函数原型:
empty(); //判断容器是否为空
capacity(); //容器的容量
size(); //返回容器中元素的个数
resize(); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置,若容器变短,则删除末尾超出容器长度的元素
resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem 填充新位置,若容器变短,则删除末尾超出容器长度的元素
#include<iostream> using namespace std; #include<vector> void printVector(vector<int>&v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { vector<int>v1; //默认构造 无参构造 for (int i = 0; i < 10; i++) { v1.push_back(i); } printVector(v1); //0 1 2 3 4 5 6 7 8 9 if (v1.empty()) //为真 代表容器为空 { cout << "v1为空" << endl; //v1不为空 } else { cout << "v1不为空" << endl; cout << "v1的容量为:" << v1.capacity() << endl; //v1的容量为:13 cout << "v1的大小为:" << v1.size() << endl; //v1的大小为:10 v1.resize(15); printVector(v1); //0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 v1.resize(15, 100); printVector(v1); //0 1 2 3 4 5 6 7 8 9 100 100 100 100 100 v1.resize(7); printVector(v1); //0 1 2 3 4 5 6 } } int main() { test1(); system("pause"); return 0; }
3.2.5 vector插入与删除
功能描述:对vector容器进行插入与删除操作;
函数原型:
push_back(ele); //尾部插入元素ele
pop_back(); //删除最后一个元素
insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count, ele); //迭代器指向位置pos插入count个元素ele
erase(const_iterator pos); //删除迭代器指向的元素
erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的所有元素
clear(); //删除容器中所有元素
#include<iostream> using namespace std; #include<vector> //vector插入与删除 /* push_back(ele); //尾部插入元素ele pop_back(); //删除最后一个元素 insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele insert(const_iterator pos, int count, ele); //迭代器指向位置pos插入count个元素ele erase(const_iterator pos); //删除迭代器指向的元素 erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的所有元素 clear(); //删除容器中所有元素 */ void printVector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { vector<int>v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); //遍历 printVector(v1); //10 20 30 40 50 //尾删 v1.pop_back(); printVector(v1); //10 20 30 40 //插入 第一个参数是迭代器 v1.insert(v1.begin(), 100); printVector(v1); //100 10 20 30 40 v1.insert(v1.begin(), 2, 1000); printVector(v1); //1000 1000 100 10 20 30 40 //删除 第一个参数是迭代器 v1.erase(v1.begin()); printVector(v1); //1000 100 10 20 30 40 v1.erase(v1.begin(), v1.end()); printVector(v1); //打印一行空白 v1.clear(); printVector(v1); //打印一行空白 } int main() { test1(); system("pause"); return 0; }
3.2.6 vector数据存取
功能描述:对vector中的数据存取操作
函数原型:
at (int idx); //返回索引idx所指的数据
operator[ ]; //返回索引idx所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
#include<iostream> using namespace std; #include<vector> //vector数据存取 /* at (int idx); //返回索引idx所指的数据 operator[ ]; //返回索引idx所指的数据 front(); //返回容器中第一个数据元素 back(); //返回容器中最后一个数据元素 */ void printVector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { vector<int>v1; for (int i = 0; i < 10; i++) //第一种遍历 { v1.push_back(i); } printVector(v1); //利用[]方式访问数组中的元素 for (int i = 0; i < v1.size(); i++) { cout << v1[i] << " "; } cout << endl; //利用at方式访问元素 for (int i = 0; i < v1.size(); i++) { cout << v1.at(i) << " "; } cout << endl; //获取第一个元素 获取最后一个元素 cout << "第一个元素是:" << v1.front() << endl; cout << "最后一个元素是:" << v1.back() << endl; } int main() { test1(); system("pause"); return 0; }
3.2.7 vector互换容器
功能描述:实现两个容器内元素进行互换
函数原型:swap(vec); //将vec与本身的元素互换
#include<iostream> using namespace std; #include<vector> //vector互换容器 /* swap(vec); */ void printVector(vector<int>& v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test1() { vector<int>v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } cout << "交换前:" << endl; printVector(v1); //0 1 2 3 4 5 6 7 8 9 vector<int>v2; for (int i = 10; i > 0; i--) { v2.push_back(i); } printVector(v2); //10 9 8 7 6 5 4 3 2 1 cout << "交换后:" << endl; v1.swap(v2); //交换 printVector(v1); //10 9 8 7 6 5 4 3 2 1 printVector(v2); //0 1 2 3 4 5 6 7 8 9 } int main() { test1(); system("pause"); return 0; }
实际用途:收缩内存
#include<iostream> using namespace std; #include<vector> //vector互换容器 /* swap(vec); */ //2、实际用途:巧用swap可以收缩内存空间 void test1() { vector<int>v; for (int i = 0; i < 100000; i++) { v.push_back(i); } cout << "v的容量为:" << v.capacity() << endl; cout << "v的大小为:" << v.size() << endl; v.resize(3); cout << "v的容量为:" << v.capacity() << endl; cout << "v的大小为:" << v.size() << endl; //用swap收缩内存空间 vector<int>(v).swap(v); cout << "v的容量为:" << v.capacity() << endl; cout << "v的大小为:" << v.size() << endl; } int main() { test1(); system("pause"); return 0; }
说明:
vector<int>(v).swap(v); //匿名对象.swap(v)
vector<int>(v)为匿名对象,利用v创建了一个新的对象(调用了一次拷贝构造函数),新的对象没有名称,按照v来给它做初始化操作,它会按照v目前所用的元素个数来初始化这个匿名对象的大小。所以这个匿名对象的大小和容量初始就为3(跟v一样)。
.swap(v) 容器交换;将容器v和匿名对象进行交换,此时的v即为被收缩内存后的容器,而匿名对象则会在当前行代码执行完后被编译器回收;
3.2.8 vector预留空间
功能描述:减少vector在动态扩展容量时的扩展次数
函数原型:reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。
#include<iostream> using namespace std; #include<vector> //vector预留空间 /* reserve(int len) */ void test1() { vector<int>v; //利用reserve预留空间 v.reserve(100000); //num=1 如果没有这行代码,num=30,因为vector容器动态扩展了30次才存储了100000个数据 int num = 0; int* p = NULL; for (int i = 0; i < 100000; i++) { v.push_back(i); if (p != &v[0]) { p = &v[0]; num++; } } cout << "num = " << num << endl; } int main() { test1(); system("pause"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!