vector容器 Posted on 2020-04-22 | In STL Words count in article: 1.4k | Reading time ≈ 7 vector容器 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225//// Created by Jason on 2020/3/29.///* *3.2.4.1 vector构造函数 vector<T>v;//釆用模板实现类实现,默认构造函数+ vector(v. begin(),v.end())://将 vector(v. begin(),v.end())区间中的元素拷贝给本身。 vector(n,elem)://构造函数将n个elem 拷贝给本身。 vector( const vector&vec)://拷贝构造函数。 //例子使用第二个构造函数我们可以 int arr[]={2,3,4,1,9}; vector<int >v1(arr, arr+sizeof(arr)/ sizeof(int));3.2.4.2 vector常用赋值操作 assign(beg,end):/将[beg,end)区间中的数据拷贝赋值给本身。 assign(n,elem)://将n个elem拷贝赋值给本身。 vector& operator=( const vector&vec)://重载等号操作符 swap(vec)://将vec与本身的元素互换。3.2.4.3 vector大小操作 size() //返回客器中元素的个数 empty()//判断器是否为空 resize( int num)://重新指定窨器的长度为num,若寳器变长,则以默认值填充新位置。如果窨器变 则末尾超出容器长度的元素被刪除。 resize( int num,elem)://重新指定窨器的长度为num,若寳器变长,唢以e值填充新位置。如 果窨器变短,则末尾超出窨器长度的元素被刪除。 capacity()://睿器的窖量 reserve( int len);//窖器预留1mn个元素长度,预留位置不初始化,元素不可访问。3.2.4.4 vector数据存取操作 at( int idx)://返回索引id所指的数据,如果iκ越畀,抛岀ourt_ of range异常。艹 operator[]://返回索引id所指的数据,越畀时,运行直接报错 front()//返回窨器中第一个数据元素 back()//返回窨器中最后一个数据元素3.2.4.5 vector插入和删除操作 insert( const_ iterator pos, int count,elem)://迭代器指向位置pos插入cmt个元素elem. push back(elem)://尾部插入元素e1em pop_ back()//刪除最后一个元素 erase( const_iterator start, const_ iterator end)://刪除迭代器从 start到end之间的元素 erase( const_iterator pos)://刪除迭代器指向的元素 clear()://刪除窖器中所有元素 拓展 sort 函数,可以加上greater<Elem>来解决降序 * */#include<bits/stdc++.h>using namespace std;void test01() { vector<int> v; for (int i = 0; i < 160; i++) { v.push_back(i); cout<<v.capacity()<<endl; }}void printVector(vector<int>&v){ for(vector<int>::iterator it = v.begin();it!=v.end(); it++) { cout<<*it<<endl; }}void test02(){ vector<int>v1; vector<int>v2(10,100);// printVector(v2); vector<int>v3(v2.begin(),v2.end());// printVector(v3); vector<int>v4;// v4.assign(v3.begin(),v3.end()); v4 = v3;//这两种方法都可以 printVector(v4); int arr[]={2,3,4,1,9}; vector<int >v5(arr, arr+sizeof(arr) / sizeof(int)); //swap来交换 v4.swap(v5) ;//4与5交换了 printVector(v4);}void test03(){ vector<int>v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); cout<<"size = "<<v1.size()<<endl; if(v1.empty())//如果为空,返回值为1,不为空,返回值为0; { cout<<"V1 is empty"<<endl; }else cout<<"v1 is not empty"<<endl; v1.resize(10);//不足10,默认0填充// printVector(v1); v1.resize(10,1000);//可以指定,默认为1000填充// printVector(v1); v1.resize(3);//变短了,末尾超出容器的部分被删掉// printVector(v1); v1.resize(4);//被删除后,恢复原来的长度,删除的数据不回复原 printVector(v1); cout<<"The first elem of v1 is "<<v1.front()<<endl; cout<<"The last elem of v1 is "<<v1.back()<<endl; /************************************************************/ v1.insert(v1.begin(),1000);//插一个数 v1.insert(v1.begin(),2,2000);//插自定义 //1000 10 20 30 0 printVector(v1); v1.push_back(999); printVector(v1); v1.pop_back(); printVector(v1); //删除 v1.erase(v1.begin() );//头部删除 printVector(v1); v1.erase(v1.begin(),v1.end());//全部删除 printVector(v1); v1.push_back(1); printVector(v1); v1.clear();//清空 =v1.erase(v1.begin(),v1.end()); printVector(v1);}/*************************************************************************///案例,巧用swap 收缩内存void test04(){ 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<<"resize(3)以后"<<endl; cout<<"v的容量"<<v.capacity()<<endl; cout<<"v的大小"<<v.size()<<endl; vector<int>(v).swap(v); cout<<"swap(v)以后,会收缩内存"<<endl; cout<<"v的容量"<<v.capacity()<<endl; cout<<"v的大小"<<v.size()<<endl;}/****************************************************************************/void test05(){// 用reserve预留空间! vector<int>v; int num = 0; int *p = NULL; for(int i =0;i<100000;i++) { v.push_back(i); //当容量不够的时候,vector容器会找到新的空间,这时候p就不指向头部了 if(p!= &v[0]) { p = &v[0]; num++; } } cout<<"NUM ="<<num<<endl;}void test06(){ vector<int>v; int num = 0; int *p = NULL; v.reserve(10000000); for(int i =0;i<100000;i++) { v.push_back(i); //当容量预留后,p就没动过 if(p!= &v[0]) { p = &v[0]; num++; } } cout<<"NUM ="<<num<<endl;}/***************************************************************///逆序遍历void test07(){ vector<int>v1; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); cout<<"正序遍历"<<endl; printVector(v1); cout<<"逆序遍历"<<endl; for(vector<int>::reverse_iterator it = v1.rbegin();it!=v1.rend();it++) { cout<<*it<<endl; } //vector 容器的迭代器,随机访问迭代器 //如何让判断一个容器的迭代器是否支持随机访问 vector<int>::iterator itBegin = v1.begin(); itBegin = itBegin+1; itBegin++; itBegin--; list<int>l; l.push_back(10); l .push_back(20); l.push_back(30); list<int>::iterator it2 = l.begin(); it2 ++; it2 --;// it = it+1; 会报错!!!// list 容器不支持随机访问}/********************************************************************/int main(){// test01();// test02();// test03();// test04();// test05();// test06(); test07(); system("pause"); return 0;} -------------本文结束,感谢您的阅读------------- Post author: Jason Post link: https://jasonxqh.github.io/2020/04/22/vector%E5%AE%B9%E5%99%A8/ Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.