C++容器vector和迭代器iterator
vector是同一种对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的类存。引入头文件#include<vector>1.vector对象的定义和初始化[cpp] view plain copyvector<T> v1 vector保存类型为T的对象。默认构造函数,v
vector是同一种对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的类存。引入头文件
#include<vector>
1.vector对象的定义和初始化
- vector<T> v1 vector保存类型为T的对象。默认构造函数,v1为空
- vector<T> v2(v1) v2是v1的一个副本
- vector<T> v3(n,i) v3包含n个值为i的元素
- vector<T> v4(n) v4含有值初始化的元素的n个副本
如果没有指定元素的初始化式,标准库将自行提供一个元素初始值进行初始化,初始值取决于存储在vector中元素的数据类型。
例:
vector保存内置类型如int,那么标准库将用0值创建元素初始化式
vector<int> res(10); //10个元素,每个被初始化为0
vector保存的是含有构造函数的类类型的元素,标准库将用该类型的默认的构造函数创建元素的初始化式
vector<string> res(10) //10个元素,每个被初始化为空字符串
还有第三种情况,元素类型可能是没有定义构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。
2.vector对象的操作
几种重要的操作
- 新增或移除元素的方法
vec.push_back()
- 新增元素至 vector 的尾端,必要時會進行記憶體配置。vec.pop_back()
- 刪除 vector 最尾端的元素。vec.insert()
- 插入一個或多個元素至 vector 內的任意位置。vec.erase()
- 刪除 vector 中一個或多個元素。vec.clear()
- 清空所有元素。
- 取得長度/容量
vec.size()
- 取得 vector 目前持有的元素個數。vec.empty()
- 如果 vector 內部為空,則傳回 true 值。vec.capacity()
- 取得 vector 目前可容納的最大元素個數。這個方法與記憶體的配置有關,它通常只會增加,不會因為元素被刪減而隨之減少。
- 重新配置/重設長度
vec.reserve()
- 如有必要,可改變 vector 的容量大小(配置更多的記憶體)。在眾多的 STL 實做,容量只能增加,不可以減少。vec.resize()
- 改變 vector 目前持有的元素個數。
- 迭代 (Iterator)
vec.begin()
- 回傳一個Iterator,它指向 vector 第一個元素。vec.end()
- 回傳一個Iterator,它指向 vector 最尾端元素的下一個位置(請注意:它不是最末元素)。vec.rbegin()
- 回傳一個反向Iterator,它指向 vector 最尾端元素的。vec.rend()
- 回傳一個Iterator,它指向 vector 的第一個元素。
3.迭代器简介
除了使用下标来访问vector对象的元素外,标准库还提供了访问元素的方法:使用迭代器。迭代器是一种检查容器内元素并且遍历元素的数据类型。
1.容器的iterator类型
每种容器类型都定义了自己的迭代器类型,如vector: vector<int> ::iterator iter; 变量名为iter。
2.begin和end操作
每种容器都定义了一队命名为begin和end的函数,用于返回迭代器。
- 如果容器中有元素的话,由begin返回的元素指向第一个元素。
vector<int>::iterator iter=v.begin();
若v不为空,iter指向v[0]。
- 由end返回的迭代器指向最后一个元素的下一个,不存在,若v为空,begin和end返回的相同。
*iter=0;
iter++即将迭代器向前移动一个位置
即将v[0]赋值为0,由end返回的不允许进行解操作。
- ==和!=操作符来比较两个迭代器,若两个迭代器指向同一个元素,则它们相等,否则不想等。
使用举例:
- #include <iostream>
- #include<vector>
- using namespace std;
- int main()
- {
- vector<int> v;
- cout<<"在末尾插入元素 "<<endl;
- for(int i=0;i<10;i++){
- v.push_back(i);
- }
- cout<<"删除末尾元素 "<<endl;
- v.pop_back();
- cout<<"使用front()、at()、back() "<<endl;
- cout<<v.front()<<"-"<<v.at(4)<<"-"<<v.back()<<endl;
- cout<<"判断不为空、插入元素"<<endl;
- for(int i=0;i<10;i++){
- if(!v.empty())
- v.push_back(++i);
- }
- cout<<"打印vector数组元素"<<endl;;
- for(size_t i=0;i<v.size();i++){
- cout<<"第"<<i<<"个元素"<<":"<<v[i]<<endl;
- }
- return 0 ;
- #include <iostream>
- #include<vector>
- #include <cstdlib>
- using namespace std;
- int main()
- {
- vector<int> v1;
- vector<int>::iterator it;
- for(int i=0;i<10;i++){
- v1.push_back(i);
- }
- cout<<"正向输出:"<<endl;
- for(it=v1.begin();it!=v1.end();it++){
- cout<<*it<<" ";
- }
- cout<<endl;
- cout<<"反向输出:"<<endl;
- vector<int>::reverse_iterator rit;
- for(rit=v1.rbegin();rit!=v1.rend();rit++){
- cout<<*rit<<" ";
- }
- int arr[]={0,1,2,3,4,5,6,7,8,9};
- vector<int> v2(arr,arr+10); //将arr数组复制到容器v2中去
- vector<int>::iterator it2;
- for(it2=v2.begin();it2!=v2.end();it2++){
- cout<<*it2<<" ";
- }
- vector<int> v3(v2.begin(),v2.end());//利用构造函数初始化容器v3
- vector<int>::iterator it3;
- for(it3=v3.begin();it3!=v3.end();it3++){
- cout<<*it3<<" ";
- }
- //erase和insert对于const iterater和const reverse_itetater并不支持
- vector<int> v4(10,10);
- vector<int>::iterator it4;
- for(it4=v4.begin();it4!=v4.end();it4++){
- cout<<*it4<<" ";
- }
- //resize()的使用
- cout<<endl<<"v1大小:"<<v1.size()<<endl<<"v2大小:"<<v2.size()
- <<endl<<"v3大小:"<<v3.size()<<endl<<"v4大小:"<<v4.size()
- <<endl;
- v3.resize(10,0);
- cout<<"resize()为10后v3的大小:"<<v3.size()<<endl;
- for(int i=0;i<(int)v3.size();i++){
- cout<<v3[i]<<" ";
- }
- v3.resize(5);
- cout<<endl<<"resize()为5后v3的大小:"<<v3.size()<<endl;
- for(int i=0;i<(int)v3.size();i++){
- cout<<v3[i]<<" ";
- }
- //擦除的使用
- v1.clear();
- cout<<endl<<"v1全擦除后的大小:"<< v1.size()<<endl;
- cout<<"插入操作insert()";
- vector<int>::iterator itx;
- itx=v1.begin();
- cout<<endl<<"在位置1插入88"<<endl;;
- v1.insert(itx,88);//在开始的位置插入111,
- for(int i=0;i<(int)v1.size();i++){
- cout<<v1[i]<<" ";
- }
- cout<<endl;
- v1.insert(itx,10,5);//从位置0开始连续插入10个5;
- for(int i=0;i<(int)v1.size();i++){
- cout<<v1[i]<<" ";
- }
- cout<<endl<<"擦除位置5到位置10的元素"<<endl;
- v1.erase(itx+5,itx+10); //擦除位置5到位置10的元素、
- for(int i =0;i<(int)v1.size();i++){
- cout<<v1[i]<<" ";
- }
- v1.clear();
- cout<<endl<<"全擦除后v1大小"<<v1.size()<<endl;
- vector<int> vec;
- vec.swap(v2);
- vec.reserve(1000);
- cout<<vec.size()<<endl;
- return 0 ;
- }
更多推荐
所有评论(0)