c++中vector容器(维克多配98k ^_^)
2024-04-20 18:09:30
- 维克多配98k,天下无敌^_ ^,开个玩笑,下面进入正题:
ptr_vector
负责存放在容器内部指针的动态内存的生命期
vector
不负责存放在容器内部指针的动态内存的生命期
- vector是动态空间,随着元素的加入,它会自动扩充空间容纳新元素。
- 单端操作,尾插,尾删。
- vector容器的迭代器:随机访问迭代器(迭代器+n可以通过编译)。它允许使用基于任何迭代器类型的算法,因为随机访问迭代器具有所有迭代器的功能。
- 容量(capacity):空间然元素的个数。
- 大小(size):空间实际存放元素的个数。
- capacity >= size。
vector<int> v;
v.push_back(数据);
//往容器v中存放数据vector<int>::iterator beg = v.begin();
//起始迭代器:指向第0个元素的位置
//也可以利用自动类型推断auto:
auto beg = v.begin();vector<int>::iterator endi = v.end();
//结束迭代器:指向尾元素的下一个位置
void test01()
{//单端动态数组vector类模板vector<int> v;//v就是一个具体的vector容器//pash_ back尾部插入v.push_back(100) ;v.push_back(200) ;v.push_back(300) ;v.push_back(400) ;//访问数据//定义一一个迭代器存储v的起始迭代器vector<int>::iterator biginIt = v.begin() ;//定义:个迭代器存储v的结束迭代器vector<int>::iterator endIt = v.end() ;
}
//定义:个迭代器存储v的结束迭代器
vector<int>: :iterator endIt = V .end() ;
//for循环遍历1
for(;biginIt != endIt; biginIt++)
{//对迭代器取★代表的是容器的元素//*biginItcout<<*biginIt<<" ";
}
cout< <endl;
//for循环遍历2 (推荐)
for (vector<int>: :iterator it=v.begin(); it !=v.end(); it++)
{cout<<*it<<"." ;
}
cout<<endl;
容器嵌套容器
vector<vector<int>> v;
v.push_back(v1);
v.push_back(v2);
...
//需求在定义一一个vector容器存放v1 v2 v3
vector<vector<int>> v;
v.push_back(v1) ;
v.push_back(v2);
v.push_back(v3) ;
//for循环遍历
for (vector<vector<int>>: :iterator it = v.begin(); it!=v.end(); it++)
{//*it == vector<int> v1 v2 v3for(vector<int>: :iterator mit=(*it) .begin(); mit!=(*it) .end(); mit++ ){//*mit ==intcout<<*mit<<" " ;}cout<<endl;
}
vector构造函数
vector<T> v; //采用模板实现类实现,默认构造函数
vector<int> v(n);//创建大小为n容量的容器
vector(v.begin(),v.end());//将v[begin(), end()) 区间中的元素拷贝给本身。
vector(n,elem) ;//构造函数将n个elem拷贝给本身。
vector(const vector &vec);//拷 贝构造函数。
- 例子:
//vector(n,elem) ;//构造函数将n个elem拷贝给木身
vector<int> v1(10,5) ;
printVectorInt(v1) ;
//vector(v.begin(),v.end()) ;//将v [begin(),end()) 区间中的元素拷贝给本身
vector<int> v2(v1.begin()+2, v1.end()- 2) ;
printVectorInt(v2) ;
vector<int> v3(v1);
printVectorInt(v3) ;
vector常用的赋值操作
assign(beg, end) ;//将[beg, end) 区间中的数据拷贝赋伯给本身。
assign(n,elem);//将n 个elem拷贝赋值给本身。
vector& operator=(const vector &vec) ;//重载等号操作符
swap(vec);//将vec与 本身的元素互换。
- 例子:
vector<int> v1(5,10) ;
vector<int> v2 ;
//vector& operator=(const vector &vec) ;/ /重载等号操作符
v2=v1;
printVectorInt(v2) ;
//assign(n,elem) ;//将n个elem拷贝赋值给木身
vector<int> v3 ;
v3.assign(5,100) ;
printVectorInt(v3) ;
//assign(beg,end) ;/ /将[beg,end) 区间中的数据拷贝赋值给本身
vector<int> v4;
v4.assign(v3.begin(),v3.end()) ;
printVectorInt(v4) ;
//swap(vec);//将vec与本身的元素互换。
vector<int> v5(5,20) ;
vector<int> v6(10,40) ;
printVectorInt(v5) ;
printVectorInt(v6) ;
v5.swap(v6) ;
printVectorInt(v5) ;
printVectorInt(v6) ;
vector大小操作
size();//返问容器中元素的个数
empty();//判断容器是否为空
resize(int num);// 重新指定容器的长度为num,若容器变长,则以默认值填充新位
置。如果容器变短,则木尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定 容器的长度为num,若容器变长,则以elem 值填
充新位置。如果容器变短,则末尾超出容器长>度的元索被删除。
capacity();//容器的容量
reserve(int len);// 容器预留Len_个元索长度,预留位置不初始化,元索不可访问。
- resize只能作用于容器的大小size,不能作用于容量capacity。
- 使用swap收缩容器的容量。
- 收缩空间时,先使用resize,再使用swap。
//使用reszie将空间 置成10个元素(可以吗? )
v.resize(10) ; //不能修改容量只 能修改size
cout<<"size = "<<v.size()<<endl;// 10
cout<<"capactiy = "<<v.capacity()<<endl; //1024
//使用swap收缩容器的容量
vector<int>(v) . swap(v) ;
cout<<"size = "<<v.size()<<endl; //10
cout<<"capactiy =:"<<v.capacity()<<endl;//10
vector数据存取
at(int idx); //返回索引idx所指的数据, 如果idx越界,抛出out_ _of_ range异常。
operator[] ;//返回索引i dx所指的数据,越界时,运行直接报错
front() ;//返回容器中第一个数据元素
back() ;//返回容器中最后-一个数据元素
printVector Int(v) ;//10 20 30 40
cout<<v[2]<<endl; //30
cout<<v.at(2)<<endt;//30
//[] 越界不抛出异常
//at越界抛出异常
cout<<"front = "<<v.front()<<endl;//10
cout<<"back = "<<v.back()<<endl; //40
vector插入和删除
insert(const_iterator pos, int count,ele);
//迭代器指向位置pos插入count个元素ele.vector<int> old_v;
vector<int> new_v;
insert(old_v.begin(), new_v.begin() + 1, new_v.end());
//第一个参数指定了新元素的插入位置,
//第二个和第三个迭代器参数定义了被插入区间,
//该区间通常是另一个容器对象的一部分。//下面的代码将新元素插入到old.end()前面,
//即矢量最后一个元素的后面。
old_v.insert(old_v.end(), new_v.begin() + 1, new_v.end());push_back(ele); //层部插入 元素ele
pop_back();// 删除最后一个无杀
erase(const_iterator start, const_iterator end);
// 明除迭代群从start到end心间的元素
erase(const_iterator pos);// 刚除迭f器指向豹元素
clear();//删除容器中所存元素
//迭代器指向位置pos插入count个元素ele.
v.insert(v.begin()+2,3,100) ;
printVectorInt(v) ;//1020 100 100 100 30 40
//尾部删除: pop_ back();/ /删除最后-一个元素
v.pop_back();//将 40删除了
printVectorInt(v) ;/ /1020 100 100 100 30
//erase(const_iterator start, const_iterator end) ;
//删除迭代器从start到end之间的元素
v.erase(V .begin()+2, V .end()-1) ;
printVector Int(v) ;/ /1020 30
//erase(const_ iterator pos) ;//删除迭代器指向的元素
v.erase(v.begin()+1) ; //删除20的位置
printVectorInt(v);//10 30
rbegin(),rend()
- 要反向打印容器的内容,vector类有一个名为rbegin()的成员函数和一个名为rend()的成员函数,前者返回一个指向超尾的反向迭代器,后者返回一个指向第一个元素的反向迭代器。因为对迭代器执行递增操作将导致它被递减,所以可以使用下面的语句来反向显示内容:
copy(dice.rbegin(), dice.rend(), out_iter);
// display in reverse order
- rbegin()和end()返回相同的值(超尾),但类型不同(reverse_iterator和iterator)。同样,rend()和begin()也返回相同的值(指向第一个元素的迭代器),但类型不同。
vector未雨绸缪机制
- 只要空间满了。就会另寻空间。
- 测试:
void test03 ()
{int *p = NULL;int count =0;for(int i=0;i<1000;i++){if(p != &v[0] ){cout<<"----------"<<count++<<"-----<<endl ;p=&v[0] ;}v.push_back(i) ;cout<<"cacapity = "<<v.capacity()<<",size = "<<v.size()<<endl;
}
vector自定义排序规则
- 可以重载“<”。在list中已经讲到。
- 也可以用下面方式,使用sort()中的第三个参数指定排序规则即可。
bool myComparePerson(const Person &ob1, const Person &ob2)
{return ob1.age > ob2.age;
}
void test04()
{vector<Person> v;v. push_back(Person(" 德玛西亚",48));v. push_back(Person("提莫",28));v. push_back(Person("狗头", 18));v. push_back(Person("牛头",19));PrintVectorPerson(V);//默认比较方式从小-->大//vector存放自定义数据可指定排序规则( 普道函数)sort(v.begin(),v.end(), myComparePerson);PrintVectorPerson(v);
}
最新文章
- 深扒:一个司机如何潜入机房偷数据…
- 乐视电视明明可以降低配置,为什么偏偏要涨价?
- nb-iot模块的at指令_ESP8266-学习-01 系列了解模块针脚及烧录
- qt中关闭窗口资源释放问题
- Android app native代码性能分析
- OSChina 周一乱弹 ——程序员用代码写的爱情
- java 防止反射_Java设计模式(一):单例模式,防止反射和反序列化漏洞
- excel函数中if android,在Android中阅读Excel
- .sh文件是什么语言_FastDFS分布式文件系统的搭建安装
- linux sha1sum命令,讲解Linux中校验文件的MD5码与SHA1码的命令使用
- 为了做服务注册迁移,我提前准备了这些东西,来看看对你有没有用!
- android studio打测试包,AndroidStudio1.5上进行单元测试(简单)
- 锐浪报表数据源access_C# 锐浪报表 示例源码
- Java多线程系列--【JUC集合09】- LinkedBlockingDeque
- CGAL::2D Arrangements
- 自动化测试需要学习的知识
- C++OpenCV系统学习(17)——图像分割与抠图(6)——视频背景替换
- ははうえさま/亲爱的妈妈
- 【blade的UI设计】理解前端MVC与分层思想
- 面试题CSS02【21-10-14】