C++ STL vector
vector 与 普通数组 区别
不同之处:数组是静态的 而vector可以动态扩展
动态扩展:并不是在原空间之后续接新空间,而是找更大的空间内存,然后将原数据拷贝新空间,释放原空间。
vector的迭代器是支持随机访问的迭代器
vector构造函数
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 //vector容器构造函数 6 /* 7 vector<T> v; //采用模板实现类实现,默认构造函数 8 vector(v.begin(),v.end()); //将 v[begin(),end()) 前闭后开 区间中的元素拷贝给本身 9 vector(n,elem); //构造函数将n个elem拷贝给本身 10 vector(const vector &vec); //拷贝构造函数 11 */ 12 void printVector(vector<int>& v) 13 { 14 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 15 { 16 cout << *it << " "; 17 } 18 cout << endl; 19 } 20 void test() 21 { 22 vector<int> v1;//默认构造 23 for (int i = 0; i < 10; i++) 24 { 25 v1.push_back(i); 26 } 27 printVector(v1);//0 1 2 3 4 5 6 7 8 9 28 //通过区间方式进行构造 29 vector<int>v2(v1.begin(), v1.end()); 30 printVector(v2);//0 1 2 3 4 5 6 7 8 9 31 //n个elem方式构造 32 vector<int>v3(10, 100);//个数 数值 33 printVector(v3);//100 100 100 100 100 100 100 100 100 100 34 //拷贝构造 35 vector<int>v4(v3); 36 printVector(v4);//100 100 100 100 100 100 100 100 100 100 37 } 38 int main() 39 { 40 test(); 41 system("pause"); 42 return 0; 43 }
赋值操作
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 //vector容器赋值操作 6 /* 7 vector& operator=(const vector &vec);//重载等号操作符 8 assign(beg, end); //将[beg,end)区间中的数据拷贝赋值给本身 9 assign(n,elem); //将n个elem拷贝赋值给本身 10 */ 11 void printVector(vector<int>& v) 12 { 13 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 14 { 15 cout << *it << " "; 16 } 17 cout << endl; 18 } 19 void test() 20 { 21 vector<int> v1; 22 for (int i = 0; i < 10; i++) 23 { 24 v1.push_back(i); 25 } 26 printVector(v1);// 0 1 2 3 4 5 6 7 8 9 27 //赋值操作 28 vector<int>v2; 29 v2 = v1; 30 printVector(v2);// 0 1 2 3 4 5 6 7 8 9 31 //assign 32 vector<int>v3; 33 v3.assign(v1.begin(), v1.end()); 34 printVector(v3);// 0 1 2 3 4 5 6 7 8 9 35 //assign n个elem 36 vector<int>v4; 37 v4.assign(10, 100); 38 printVector(v4);// 100 100 .... 39 } 40 int main() 41 { 42 test(); 43 system("pause"); 44 return 0; 45 }
vector容量和大小
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 //vector容器的容量和大小操作 6 /* 7 empty(); //判断容器是否为空 8 capacity(); //容器的容量 9 size(); //返回容器中元素的个数 10 resize(int num); //重新指定容器的长度num,若容器变长,则以默认值填充新位置。 11 //如果容器变短,则末尾超出容器长度的元素被删除 12 resize(int num, elem); //重新指定容器的长度num,若容器变长,则以elem值填充新位置。 13 //如果容器变短,则末尾超出容器长度的元素被删除 14 */ 15 void printVector(vector<int>& v) 16 { 17 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 18 { 19 cout << *it << " "; 20 } 21 cout << endl; 22 } 23 void test() 24 { 25 vector<int>v1; 26 for (int i = 0; i < 10; i++) 27 { 28 v1.push_back(i); 29 } 30 printVector(v1);// 0 1 2 3 4 5 6 7 8 9 31 if (v1.empty())//若为真 代表容器为空 32 { 33 cout << "v1为空" << endl; 34 } 35 else 36 { 37 cout << "v1不为空" << endl; 38 cout << "v1的容量为:" << v1.capacity() << endl;// 13 动态扩展 39 cout << "v1的大小为:" << v1.size() << endl;//10 40 } 41 //重新指定大小 42 v1.resize(15,1);//利用重载版本,可以指定默认填充值,参数2 若为v1.resize(15);//默认为0 43 printVector(v1);//0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 若为v1.resize(15);// 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 44 v1.resize(5);//如果重新指定的比原来短了,超出部分会删除掉 45 printVector(v1);// 0 1 2 3 4 46 } 47 int main() 48 { 49 test(); 50 system("pause"); 51 return 0; 52 }
vector插入和删除--push_back() --pop_back()-- insert()---erase()-- clear()
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 //vector容器的插入、删除操作 6 /* 7 push_back(ele); //尾部插入元素ele 8 pop_back(); //删除最后一个元素 9 insert(const_iterator pos, ele); //迭代器指定位置pos插入元素ele 10 insert(const_iterator pos,int count,ele); //迭代器指定位置pos插入count个元素ele 11 erase(const_iterator pos); //删除迭代器指向的元素 12 erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素 13 clear(); //删除容器中所有元素 14 15 */ 16 void printVector(vector<int>& v) 17 { 18 for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//iterator:迭代器 19 { 20 cout << *it << " "; 21 } 22 cout << endl; 23 } 24 void test() 25 { 26 vector<int>v1; 27 for (int i = 10; i < 60; i=i+10) 28 { 29 v1.push_back(i);//尾插 30 } 31 printVector(v1);// 10 20 30 40 50 32 //尾删 33 v1.pop_back(); 34 printVector(v1);// 10 20 30 4 35 v1.insert(v1.begin(), 100);//插入 第一个参数是迭代器 起始位置插入100 36 printVector(v1);//100 10 20 30 40 37 v1.insert(v1.begin(), 2, 1000);// 参数1:个数 参数2:数值 38 printVector(v1);//1000 1000 100 10 20 30 40 39 //删除 参数也是迭代器 40 v1.erase(v1.begin());// 从起始位置删除一个数字 41 printVector(v1);//1000 100 10 20 30 40 42 //清空 43 //v1.erase(v1.begin(), v1.end()); 44 v1.clear();//与上一语句等同 都为清空语句 45 printVector(v1);//空 46 } 47 int main() 48 { 49 test(); 50 system("pause"); 51 return 0; 52 }
vector数据存取 --at -- []
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 //vector数据存取 6 /* 7 at(int idx);//返回索引 idx所指的数据 8 operator[]; //返回索引 idx所致的数据 9 front(); //返回容器中第一个数据元素 10 back(); //返回容器中最后一个数据元素 11 */ 12 void test() 13 { 14 vector<int>v1; 15 for (int i = 0; i < 10; i++) 16 { 17 v1.push_back(i); 18 } 19 //利用[]访问数组容器中元素 20 for (int i = 0; i < v1.size(); i++) 21 { 22 cout << v1[i] << " "; 23 } 24 cout << endl;// 0 1 2 3 4 5 6 7 8 9 25 //利用at方式访问元素 26 for (int i = 0; i < v1.size(); i++) 27 { 28 cout << v1.at(i) << " "; 29 } 30 cout << endl;// 0 1 2 3 4 5 6 7 8 9 31 //获取第一个元素 32 cout << "第一个元素:" << v1.front() << endl;//0 33 //获取最后一个元素 34 cout << "最后一个元素:" << v1.back() << endl;//9 35 } 36 int main() 37 { 38 test(); 39 system("pause"); 40 return 0; 41 }
vector互换容器 --swap
C++中的匿名对象指的是在创建对象时不进行命名的对象。这样的对象通常用于一次性的操作,不需要再次使用或者是作为函数的参数传递。
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 //vector互换容器 6 /* 7 swap(vec); //将vec与本身的元素互换 8 */ 9 void printVector(vector<int>& v) 10 { 11 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 12 { 13 cout << *it << " "; 14 } 15 cout << endl; 16 } 17 void test()//普通交换 18 { 19 vector<int>v1; 20 for (int i = 0; i < 10; i++) 21 { 22 v1.push_back(i); 23 } 24 cout << "交换前" << endl; 25 printVector(v1);//0 1 2 3 4 5 6 7 8 9 26 vector<int>v2; 27 for (int i = 10; i > 0; i--) 28 { 29 v2.push_back(i); 30 } 31 printVector(v2);//10 9 8 7 6 5 4 3 2 1 32 cout << "交换后" << endl; 33 v1.swap(v2); 34 printVector(v1);//10 9 8 7 6 5 4 3 2 1 35 printVector(v2);//0 1 2 3 4 5 6 7 8 9 36 } 37 void test2()//收缩内存 38 { 39 vector<int>v; 40 for (int i = 0; i < 100000; i++) 41 { 42 v.push_back(i); 43 } 44 cout << "v的容量:" << v.capacity() << endl;//138255 大于10W 45 cout << "v的大小:" << v.size() << endl;//100000 46 v.resize(3);//重新指定大小 47 cout << "v的容量:" << v.capacity() << endl;//138255 48 cout << "v的大小:" << v.size() << endl;//3 49 //巧用swap收缩内存 50 vector<int>(v).swap(v); 51 //vector<int>(v)匿名对象 通过swap将匿名对象(v)和实际的v指针指向交换 52 //并且语句执行完后释放匿名对象指向 即释放容量138255的空间 v指向容量为3的空间 53 cout << "v的容量:" << v.capacity() << endl;//3 54 cout << "v的大小:" << v.size() << endl;//3 55 } 56 int main() 57 { 58 //test(); 59 test2(); 60 system("pause"); 61 return 0; 62 }
vector容器-预留空间 --reserve
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 using namespace std; 5 //vector预留空间:减少vector在动态扩展容量时的扩展次数 6 /* 7 reserve:预定 8 reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问 9 */ 10 void test() 11 { 12 vector<int>v;//初始开辟一个空间 13 14 //利用reserve预留空间 15 v.reserve(100000);// 只开辟一次 16 17 int num = 0;//统计开辟次数 18 int* p = NULL; 19 for (int i = 0; i < 100000; i++) 20 { 21 v.push_back(i); 22 if (p != &v[0])//&v[0] 初始空间的首地址 开辟新空间则地址改变 23 { 24 p = &v[0];//指针p指向新地址 25 num++; 26 } 27 } 28 cout << "num = " << num << endl; 29 } 30 int main() 31 { 32 test(); 33 system("pause"); 34 return 0; 35 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)