C++容器vector和迭代器iterator

vector是同一种对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的类存。引入头文件

#include<vector>

1.vector对象的定义和初始化

[cpp]
  1. vector<T> v1             vector保存类型为T的对象。默认构造函数,v1为空  
  2. vector<T> v2(v1)         v2是v1的一个副本  
  3. vector<T> v3(n,i)        v3包含n个值为i的元素  
  4. vector<T> v4(n)          v4含有值初始化的元素的n个副本  


如果没有指定元素的初始化式,标准库将自行提供一个元素初始值进行初始化,初始值取决于存储在vector中元素的数据类型。

例:

vector保存内置类型如int,那么标准库将用0值创建元素初始化式

vector<int> res(10);      //10个元素,每个被初始化为0

vector保存的是含有构造函数的类类型的元素,标准库将用该类型的默认的构造函数创建元素的初始化式

vector<string> res(10)      //10个元素,每个被初始化为空字符串

还有第三种情况,元素类型可能是没有定义构造函数的类类型。这种情况下,标准库仍产生一个带初始值的对象,这个对象的每个成员进行了值初始化。

2.vector对象的操作

几种重要的操作

  1. 新增或移除元素的方法
    1. vec.push_back() - 新增元素至 vector 的尾端,必要時會進行記憶體配置。
    2. vec.pop_back() - 刪除 vector 最尾端的元素。
    3. vec.insert() - 插入一個或多個元素至 vector 內的任意位置。
    4. vec.erase() - 刪除 vector 中一個或多個元素。
    5. vec.clear() - 清空所有元素。
  2. 取得長度/容量
    1. vec.size() - 取得 vector 目前持有的元素個數。
    2. vec.empty() - 如果 vector 內部為空,則傳回 true 值。
    3. vec.capacity() - 取得 vector 目前可容納的最大元素個數。這個方法與記憶體的配置有關,它通常只會增加,不會因為元素被刪減而隨之減少。
  3. 重新配置/重設長度
    1. vec.reserve() - 如有必要,可改變 vector 的容量大小(配置更多的記憶體)。在眾多的 STL 實做,容量只能增加,不可以減少。
    2. vec.resize() - 改變 vector 目前持有的元素個數。
  4. 迭代 (Iterator)
    1. vec.begin() - 回傳一個Iterator,它指向 vector 第一個元素。
    2. vec.end() - 回傳一個Iterator,它指向 vector 最尾端元素的下一個位置(請注意:它不是最末元素)。
    3. vec.rbegin() - 回傳一個反向Iterator,它指向 vector 最尾端元素的。
    4. 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返回的不允许进行解操作。

  • ==和!=操作符来比较两个迭代器,若两个迭代器指向同一个元素,则它们相等,否则不想等。

使用举例:

[cpp] 
  1. #include <iostream>  
  2. #include<vector>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6.     vector<int> v;  
  7.     cout<<"在末尾插入元素 "<<endl;
  8.     for(int i=0;i<10;i++){  
  9.      v.push_back(i);  
  10.     } 
  11.     cout<<"删除末尾元素 "<<endl; 
  12.     v.pop_back(); 
  13.     cout<<"使用front()、at()、back() "<<endl;  
  14.     cout<<v.front()<<"-"<<v.at(4)<<"-"<<v.back()<<endl;  
  15.     cout<<"判断不为空、插入元素"<<endl;
  16.     for(int i=0;i<10;i++){
  17.         if(!v.empty())
  18.             v.push_back(++i);  
  19.     }  
  20.     cout<<"打印vector数组元素"<<endl;;  
  21.     for(size_t i=0;i<v.size();i++){  
  22.     cout<<"第"<<i<<"个元素"<<":"<<v[i]<<endl;   
  23. }
  24.     return 0 ;  
  25.   
[cpp] 
  1. #include <iostream>  
  2. #include<vector>  
  3. #include <cstdlib>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     vector<int> v1;  
  8.     vector<int>::iterator it;  
  9.     for(int i=0;i<10;i++){  
  10.         v1.push_back(i);  
  11.     }  
  12.     cout<<"正向输出:"<<endl;  
  13.     for(it=v1.begin();it!=v1.end();it++){  
  14.         cout<<*it<<" ";  
  15.     }  
  16.     cout<<endl;  
  17.     cout<<"反向输出:"<<endl;  
  18.     vector<int>::reverse_iterator rit;  
  19.     for(rit=v1.rbegin();rit!=v1.rend();rit++){  
  20.             cout<<*rit<<" ";  
  21.     }  
  22.  
  23.     int arr[]={0,1,2,3,4,5,6,7,8,9};  
  24.     vector<int> v2(arr,arr+10);         //将arr数组复制到容器v2中去  
  25.     vector<int>::iterator it2;  
  26.     for(it2=v2.begin();it2!=v2.end();it2++){  
  27.         cout<<*it2<<" ";  
  28.     }    
  29.     vector<int> v3(v2.begin(),v2.end());//利用构造函数初始化容器v3  
  30.     vector<int>::iterator  it3;  
  31.     for(it3=v3.begin();it3!=v3.end();it3++){  
  32.         cout<<*it3<<"  ";  
  33.     }  
  34.     //erase和insert对于const iterater和const reverse_itetater并不支持  
  35.     vector<int> v4(10,10);  
  36.     vector<int>::iterator  it4;  
  37.     for(it4=v4.begin();it4!=v4.end();it4++){  
  38.         cout<<*it4<<"  ";  
  39.     }  
  40.     //resize()的使用  
  41.     cout<<endl<<"v1大小:"<<v1.size()<<endl<<"v2大小:"<<v2.size()  
  42.         <<endl<<"v3大小:"<<v3.size()<<endl<<"v4大小:"<<v4.size()  
  43.         <<endl;  
  44.     v3.resize(10,0);  
  45.     cout<<"resize()为10后v3的大小:"<<v3.size()<<endl;  
  46.     for(int i=0;i<(int)v3.size();i++){  
  47.        cout<<v3[i]<<" ";  
  48.     }    
  49.     v3.resize(5);  
  50.     cout<<endl<<"resize()为5后v3的大小:"<<v3.size()<<endl;  
  51.     for(int i=0;i<(int)v3.size();i++){  
  52.         cout<<v3[i]<<" ";  
  53.     }  
  54.     //擦除的使用  
  55.     v1.clear();  
  56.     cout<<endl<<"v1全擦除后的大小:"<< v1.size()<<endl;  
  57.     cout<<"插入操作insert()";  
  58.     vector<int>::iterator itx;  
  59.     itx=v1.begin();  
  60.     cout<<endl<<"在位置1插入88"<<endl;;  
  61.     v1.insert(itx,88);//在开始的位置插入111,  
  62.     for(int i=0;i<(int)v1.size();i++){  
  63.             cout<<v1[i]<<" ";  
  64.     }    
  65.     cout<<endl;  
  66.     v1.insert(itx,10,5);//从位置0开始连续插入10个5;  
  67.     for(int i=0;i<(int)v1.size();i++){  
  68.         cout<<v1[i]<<" ";  
  69.     }    
  70.     cout<<endl<<"擦除位置5到位置10的元素"<<endl;  
  71.     v1.erase(itx+5,itx+10);    //擦除位置5到位置10的元素、  
  72.     for(int i =0;i<(int)v1.size();i++){    
  73.        cout<<v1[i]<<"  ";  
  74.     }  
  75.     v1.clear();  
  76.     cout<<endl<<"全擦除后v1大小"<<v1.size()<<endl;  
  77.     vector<int> vec;  
  78.     vec.swap(v2);  
  79.     vec.reserve(1000);  
  80.     cout<<vec.size()<<endl;  
  81.     return 0 ;  
  82. }  

猜你喜欢

转载自blog.csdn.net/qq_40803710/article/details/80249119
今日推荐