zoukankan      html  css  js  c++  java
  • C++之vector模板类

        vector 称为容器模板类,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型,如vector<int> vector<string> 都是数据类型。vector是一个能够存放任意类型的动态数组,能够增加和压缩数据

    初始化:

    1. int myarray[5] = {1,3,5,7,9};
    2. vector<int> ivec1(myarray , myarray+5);//数组元素值赋值给vector,深拷贝直接赋值  
    3. vector<int> ivec2(ivec1);// ok: copy elements of ivec1 into ivec2 ,深拷贝
    4. vector<int> ivec3=ivec2;//ok,深拷贝 
    5. vector<string> svec(ivec1);// error: svec holds strings, not ints  
    6. vector<int> ivec4(10, -1); // 10 elements, each initialized to -1  
    7. vector<string> svec(10, "hi!");// 10 strings, each initialized to "hi!"  
           如果没有给出元素的初始化式,则标准库生成的初始值用于初始化容器中的每个元素。元素初始化式的值取决于存储在 vector 中元素的数据类型。例如,int初始化为0,string初始化为0

    注意: 

       ①vector 中的对象是没有命名的,可以按 vector 中对象的位置来访问它们。使用下标索引[]访问,下标从0开始,且下标只能获取已存在的元素

           使用size_type 类型时,必须指出该类型是在哪里定义的。如vector<int>::size_type i

    1. for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)    
    2.     ivec[ix] = 0;  

              迭代器访问对象(推荐)

    1. vector<int>::iterator it;  
    2. for(it=vec.begin();it!=vec.end();it++)  
    3.     cout<<*it<<endl;  

    1.常用函数列表

          push_back()------新对象插入到末尾
          insert()-------------插入一个元素或多个元素或一个内范围元素至矢量中的指定位置
          pop_back()--------删除末尾元素
          at()------------------返回对指定的索引对象的引用
          front()---------------返回最前面一个数据的引用
          back()---------------传回最后一个数据的引用,故赋值时也应该是同类型的引用类型,若为空返回值不确定。
          begin()--------------Returns a random-access iterator to the first element in the vector.
          end()----------------Returns the past-the-end iterator.
          data()----------------Returns a pointer to the first element in the vector.
          assign()-------------清空vector并复制制定的元素到vector
          erase()--------------删除指定的元素或者制定区间段的元素
          resize()--------------重定义size
          clear()---------------移除容器中所有数据
          empty()--------------判断容器是否为空,为空则为真。

    1. vector<int> v1,v2;  
    2. vector<int>::iterator c1_Iter;  
    3.       
    4. v1.push_back(10);  
    5. v1.push_back(11);  
    6. v1.push_back(12);v1.push_back(13);  
    7. v1.push_back(14);  
    8. v1.pop_back();  
    9.       
    10.       
    11. int &a=v1.front();//引用  
    12. int &b=v1.back( );//引用  
    13. int &c= v1.at(0);//引用  
    14.       
    15. c1_Iter = c1.begin();//迭代器类型  
    16. c1_Iter = c1.begin();//返回指向末尾元素的后一个的迭代器  
    17.       
    18. v2.assign(v1.begin(), v1.end());//v2=v1  
    19. v2.assign({ 5, 6, 7 });//5,6,7依次push至末尾  
    20. v2.assign(4,10);//v2=10 10 10 10  
    21. v2.assign(v1.begin()+2, v1.begin()+4)//将v1索引2 3的元素赋给v2</span>      
    22. v1.erase( v1.begin( ) );//删除索引0元素  
    23. v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );//删除索引1 2 3的元素  
    24.       
    25. v1.resize( 2,40 );  
    26. cout << "The size of v1 is " << v1.size( ) << endl;//输出6  
    27. cout << "The value of the last object is " << v1.back( ) << endl;//输出40  
    28. v1.resize( 10);  
    29. cout << "The size of v1 is now " << v1.size( ) << endl;//输出10  
    30. cout << "The value of the last object is now " << v1.back( ) << endl;//输出0  
    31.       
    32. v1.insert( v1.begin( ) + 1, 88);//原索引1之前插入88  
    33. v1.insert( v1.begin( ) + 2, 4, 50 );//原索引2之前插入4个50  
    34. v1.insert( v1.begin( )+1, v1.begin( )+2, v1.begin( )+4 );//将原索引2,3的元素复制插入原索引1之前  
    35. vector < vector <int> > vv1;// initialize a vector of vectors by moving v1  
    36. vv1.insert( vv1.begin(), move( v1 ) );  
    37. if (vv1.size( ) != 0 && vv1[0].size( ) != 0 )  
    38.   {  
    39.     vector <int>::iterator Iter;  
    40.     cout << "vv1[0] =";  
    41.     for (Iter = vv1[0].begin( ); Iter != vv1[0].end( ); Iter++ )  
    42.         cout << " " << *Iter;  
    43.     cout << endl;  
    44.   }  
    45.       
    46. v1.clear( );//清空vector  

    2.vector之结构体

        vector元素类型还可以是结构体,使用时注意结构体要定义为全局。

    1. #include"stdafx.h"   
    2. #include<vector>    
    3. #include<iostream>    
    4. using namespace std;    
    5. typedef struct rect    
    6. {    
    7.     int id;    
    8.     int length;    
    9.     int width;     
    10. }Rect;    
    11. int main()    
    12. {    
    13.     vector<Rect> vec;    
    14.     Rect rect={1,2,3};    
    15.     vec.push_back(rect);    
    16.     vector<Rect>::iterator it=vec.begin();    
    17.     cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;  
    18.     return 0;  
    19. }     

    3.vector之string

         vector<string>类型的快速初始化和输出

    1. #include"stdafx.h"   
    2. #include<iostream>  
    3. #include<vector>   
    4. #include"string"  
    5. using namespace std;    
    6. int main()    
    7. {    
    8.     string   str[]={"hello""world""CHB"," "};  
    9.     vector<string> strArray1(10,"hello");  
    10.     vector<string> strArray(str,str+sizeof(str)/sizeof(str[0]));  
    11.       
    12.     for(vector<string>::iterator iter=strArray.begin();iter!=strArray.end();++iter)  
    13.         cout<<*iter<<endl;//换行符也被读入  
    14.   
    15.     for(vector<string>::size_type i=0;i<strArray1.size();i++)  
    16.         cout<<strArray1[i]<<endl;;  
    17.     return 0;  
    18. }  

    4.作为参数或者返回类型

       作为参数或者返回类型时。尊崇一般策略。比如,对于main()中的vector,子函数应该使用引用才能改变其值。例如任意数转换为2进制。如下

    #include"iostream"
    #include"vector"
    using namespace std;
    void Convert(vector<int> &ans,int number,int n)
    {
            if(!number)return;
    	else
    	 {ans.push_back(number%n);
    	  Convert(ans,number/n,n);}
    }
    void main()
    {
    	int number=121;
    	vector<int> ans;
    	Convert(ans,number,2);
    	if(!ans.empty())
    	   for(int it=ans.size()-1;it>=0;it--)
    	      cout<<ans[it];
    	cout<<endl;
    }


    5.Vector 变量之间的赋值

         直接使用赋值符号“=”赋值,构造函数()赋值,或者数组赋值。均为深拷贝,即改变源vector元素的值不会对目标vector造成影响。如下所示;

    void main()
    {
        int myarray[5] = {1,3,5,7,9};
    	vector<int>  v1(myarray , myarray+5);//深拷贝,指向地址不同
    	vector<int>  v2 = v1,v3(v1);//深拷贝,指向地址不同
        myarray[0]=10;
    	cout<<v1[0]<<" ";
    	v1[2]=11;
        cout<<v2[2]<<" ";
    	cout<<v3[2]<<" "<<endl;
     
    	string s[3]={"we","love","china"};
        vector<string> s1(s,s+3);//深拷贝,指向地址不同
        vector<string> s2=s1,s3(s1);//深拷贝,指向地址不同
        s[0]="everyone";
    	cout<<s1[0]<<endl;
    	s1[2]="Hubei";
        cout<<s2[2]<<endl;
    	cout<<s3[2]<<endl;
    
    }
       输出为:




    6.结合Pair类型的使用

    Pair类型概述

        pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下:

               pair<int, string> a;

        表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。直接对其初始化 pair<string, string> a("James", "Joy");

        由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:

                 typedef pair<string, string> mypair;
                 mypair pro("May", "Lily");
                 mypair joye("James", "Joyce");


        对于pair类,由于它只有两个元素,分别名为first和second,因此直接使用普通的点操作符即可访问其成员。


    可以使用make_pair对已存在的两个数据构造一个新的pair类型:

         int a = 8;
         string m = "James";
         pair<int, string> newone;
         newone = make_pair(a, m);
       简单的代码如下:
    #include "iostream"
    #include"algorithm"
    #include"vector"
    #include"string"
    using namespace std;
    bool  strict_weak_ordering(const pair<int,std::string> a,   const pair<int, std::string>b)     
     { return   a.first < b.first;}       
      int   main()     
      {     
            using   namespace   std;     
            vector<pair<int,   string> >   vec;     
            vec.push_back(make_pair<int, string>(6, "ABC"));     
            vec.push_back(make_pair<int, string>(4, "BCD"));     
            vec.push_back(make_pair<int, string>(7, "EFG"));     
            sort(vec.begin(), vec.end(), strict_weak_ordering);
           for(  vector<pair<int,   string>>::iterator it =vec.begin(); it !=vec.end(); ++it)     
    			cout<<it->second<<endl; 
    	   return 0;
      }



    7.附加

        #include<algorithm>中的泛函算法

       搜索算法:find() 、search() 、count() 、find_if() 、search_if() 、count_if() 
       分类排序:sort()、merge() 
       删除算法:unique() 、remove() 
       生成和变异:generate() 、fill() 、transformation() 、copy() 
       关系算法:equal() 、min() 、max() 

    部分参考自 C++ vector类型要点总结

  • 相关阅读:
    6、加法算术
    5、找出最大和最小的数
    4、计算并输出圆的面积和周长
    2、函数y=f(x)
    1、两数的平方和
    单片机中断寄存器知识点总结
    创建PCB原理图的模板
    电机知识
    结合实例谈谈航拍全景的方法和技巧
    航拍技巧
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393132.html
Copyright © 2011-2022 走看看