首页 > 代码库 > 顺序容器(二)--《C++ primer》

顺序容器(二)--《C++ primer》



前面已经简单介绍了顺序容器的定义以及一些操作,包括(添加,删除等),下面主要集中以代码的形式简单介绍一下相关用法,首先创建并初始化vector对象,一般有两大类:

1、分配指定数目元素,并初始化(分两种)
         vector<int> ivec(10);
         vector<int> ivec(10,1);
2、把vecotr对象初始化为一段元素的副本
         int a[10]={1,2,3,4,5,6,7,8,9,10}; 
         vector<int> ivec(a,a+10);
     把vector对象初始化为另一对象的副本
         vector<int> ivec1(10,1);
         vector<int> ivec2(ivec1);

例如:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    vector<int> kvec(a,a+8);
    //vector<int> ivec(10,1);
    //vector<int> kvec(ivec);
    for(vector<int>::iterator st=kvec.begin();st!=kvec.end();++st)
       cout <<*st <<' ';
    cout << endl;   
  return 0;
}


swap(c1,c2)属于赋值运算,交换c1,c2的元素,前提时c1,c2必须具有相同的类型.运用swap赋值通常比c1=c2.swap只是交换两个容器的内部数据结构,其元素本身并没有被交换,这也就意味着指向容器的迭代器,引用和指针在swap操作之后都不会失效.继而在执行swap后,可以通过该容器的迭代器访问交换后元素,如:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
   vector<int> ivec1(10,1);
   vector<int> ivec2(10,2);
   swap(ivec1,ivec2);
   for(vector<int>::iterator kk=ivec1.begin();kk!=ivec1.end();++kk)
      cout << *kk << endl;
   return 0;
}


resize(n)用于改变容器的大小,当将容器扩大时,则超出的部分默认初始化为0,若将容器缩小,则超出的元素将被删除,如:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
   int a[10]={0,1,2,3,4,5,6,7,8,9};
   vector<int> ivec(a,a+10);
   ivec.resize(20);
   //ivec.resize(5);
   for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test)
      cout << *test ;
   cout << endl;
   
  return 0;
}


关于删除元素操作后迭代器会失效,因此一定要对迭代器重新赋值,更新迭代器。如果删除操作比较频繁,一般选择list。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(){
   int a[10]={0,1,2,3,4,5,6,7,8,9};
   vector<int> ivec(a,a+10);
  
   for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test){
      if(*test%2==0){
       test=ivec.erase(test);
       --test;
      }
   }
   for(vector<int>::iterator test=ivec.begin();test!=ivec.end();++test){
      cout<< *test <<' ';
   } 
   cout << endl;
  return 0;
}

下面是某位仁兄写的,我觉得能更好地说明,所以一并贴出:

#include<iostream> 
#include<list> 
#include<vector> 
#include<deque> 
using namespace std; 
 
void print(list<int>::iterator beg,list<int>::iterator end) 
{ 
     while(beg!=end) 
     { 
        cout<<*beg<<" "; 
        beg++;                
     }      
     cout<<endl; 
} 
 
void print(vector<int>::iterator beg,vector<int>::iterator end) 
{ 
     while(beg!=end) 
     { 
        cout<<*beg<<" "; 
        beg++;                
     }      
     cout<<endl; 
} 
 
void deleteelem(list<int>&lst,int flag)  
{ 
     int base=(flag%2==0?0:1); 
     list<int>::iterator head=lst.begin(),tail=lst.end(); 
     while(head!=tail) 
     //这里不用更新指向容器尾端的迭代器 
     //因为list容器删除元素后没有出现元素的移动  
     { 
               if(*head%2==base) 
                   head=lst.erase(head); 
               //巧妙利用函数返回值                  
               else 
                   head++; 
     } 
} 
 
void deleteelem(vector<int>&vec,int flag)  
{ 
     int base=(flag%2==0?0:1); 
     vector<int>::iterator head=vec.begin(),tail=vec.end(); 
     while(head!=(tail=vec.end())) 
     //这里要更新一下指向容器尾端的迭代器 
     //因为vector容器删除元素后元素要顺序前移是迭代器失效  
     { 
               if(*head%2==base) 
                   head=vec.erase(head);                  
               else 
                   head++; 
     } 
} 
 
int main() 
{ 
    int ia[10]={0,1,2,3,4,5,6,7,8,9}; 
    list<int>odd(ia,ia+10);  
    vector<int>even(ia,ia+10); 
    print(odd.begin(),odd.end()); 
    print(even.begin(),even.end()); 
    deleteelem(odd,2); 
    print(odd.begin(),odd.end()); 
    deleteelem(even,1); 
    print(even.begin(),even.end()); 
  
    return 0; 
} 






顺序容器(二)--《C++ primer》