STL 学习笔记 ( 二. vector )

来源:互联网 发布:淘宝商品制作数据包 编辑:程序博客网 时间:2024/05/08 07:52

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋  

 

vector

 

一.  vector可以模拟动态数组

 

.  vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public

 

       拷贝构造函数和重载的赋值操作符)

 

    三.必须包含的头文件#include <vector>

 

        四.  vector支持随机存取

 

        五.  vector的大小(size)和容量(capacity)通常是不同的,size返回实际元素个数

 

               capacity返回vector能容纳的元素最大数量如果插入元素时,元素个数超过capacity

 

       需要重新配置内部存储器。 

 

 

 

->构造、拷贝和析构 

 

 

 

 ->非变动操作

 

 

 eg.

   vector<int> v1(10);   cout << "The capacity of v1 is " << v1.capacity() << endl;   cout << "The size of v1 is " << v1.size() << endl;   vector<int> v2;   v2.reserve(20);   cout << "The capacity of v2 is " << v2.capacity() << endl;   cout << "The size of v2 is " << v2.size() << endl;
output :
   The capacity of v1 is 10   The size of v1 is 10   The capacity of v2 is 20   The size of v2 is 0

 

 

 

 

 

->赋值操作

 

 

 

所有的赋值操作都有可能调用元素类型的默认构造函数,拷贝构造函数,赋值操作符和析构函数

 

如: 

  std::list<T> l;

 

  std::vector<T> v;

 

 

 

  v.assign(l.begin(),l.end());

eg.    

   vector<int> v;   v.assign( 10, 42 );   for( vector<int>::size_type i = 0; i < v.size(); i++ ) {     cout << v[i] << " ";   }   cout << endl;

OutPut : 

42 42 42 42 42 42 42 42 42 42

 

   vector<int> v1;   for( int i = 0; i < 10; i++ ) {     v1.push_back( i );   }    vector<int> v2;   v2.assign( v1.begin(), v1.end() );    for( vector<int>::size_type i = 0; i < v2.size(); i++ ) {     cout << v2[i] << " ";   
cout << endl; 

output :

0 1 2 3 4 5 6 7 8 9  

 

 

元素存取 

 

 

 下面的操作是错误的:

      std::vector<T> v;//empty

 

  v[5]= t; //runtime error

 

  std::cout << v.front(); //runtime error

eg. 

  vector<string> words;
    string str;     while( cin >> str ) words.push_back(str);     sort( words.begin(), words.end() );     cout << "In alphabetical order, the first word is '" << words.front() << "'." << endl;
假设输入是:  now is the time for all good men to come to the aid of their country
output:
In alphabetical order, the first word is 'aid'.

   vector<int> v;   for( int i = 0; i < 5; i++ ) {     v.push_back(i);   }   cout << "The first element is " << v.front()        << " and the last element is " << v.back() << endl;
output:
The first element is 0 and the last element is 4

 

 迭代器相关函数

 

 

 

使用迭代器时应注意:

 

迭代器持续有效,除非发生以下两种情况:

 

1.) 或插入元素

 

2.) 容量变化而引起内存重新分配

 eg.

    vector<string> words;    string str;     while( cin >> str ) words.push_back(str);     for( vector<string>::const_iterator iter = words.begin();         iter != words.end(); ++iter ) {      cout << *iter << endl;    }

 假设输入是 :  hey mickey you're so fine 

 output:

    hey  
    mickey    you're    so    fine

 

 

 

 

 插入(insert)元素

 

 eg.

 

   vector<char> alphaVector;   for( int i=0; i < 10; i++ ) {     alphaVector.push_back( i + 'A' );   }    // Insert four C's into the vector   vector<char>::iterator theIterator = alphaVector.begin();   alphaVector.insert( theIterator, 4, 'C' );    // Display the vector   for( theIterator = alphaVector.begin(); theIterator != alphaVector.end(); ++theIterator )    {     cout << *theIterator;   }

 output:

CCCCABCDEFGHIJ 

 

    vector<int> v1;    v1.push_back( 0 );    v1.push_back( 1 );    v1.push_back( 2 );    v1.push_back( 3 );     vector<int> v2;    v2.push_back( 5 );    v2.push_back( 6 );    v2.push_back( 7 );    v2.push_back( 8 );     cout << "Before, v2 is: ";    for( vector<int>::size_type i = 0; i < v2.size(); i++ ) {      cout << v2[i] << " ";    }    cout << endl;     v2.insert( v2.end(), v1.begin(), v1.end() );     cout << "After, v2 is: ";    for( vector<int>::size_type i = 0; i < v2.size(); i++ ) {      cout << v2[i] << " ";    
   cout << endl; 

output :

    Before, v2 is: 5 6 7 8 
    After, v2 is: 5 6 7 8 0 1 2 3 

 

 

 

删除(remove)元素

 

 

 eg.

    vector<char> alphas;    for( int i=0; i < 10; i++ ) {      static const char letters[] = "ABCDEFGHIJ";      alphas.push_back( letters[i] );    }    vector<char>::size_type size = alphas.size();    vector<char>::iterator startIterator;    vector<char>::iterator tempIterator;    for( vector<char>::size_type i=0; i < size; i++ ) {      startIterator = alphas.begin();      alphas.erase( startIterator );      // Display the vector      for( tempIterator = alphas.begin(); tempIterator != alphas.end(); ++tempIterator ) {        cout << *tempIterator;      }      cout << endl;    }

 output:

    BCDEFGHIJ    CDEFGHIJ    DEFGHIJ    EFGHIJ    FGHIJ    GHIJ    HIJ    IJ 
    J

 

 

    vector<char> alphas;    for( int i=0; i < 10; i++ ) {      static const char letters[] = "ABCDEFGHIJ";      alphas.push_back( letters[i] );    }    // display the complete vector    for( vector<char>::size_type i = 0; i < alphas.size(); i++ ) {      cout << alphas[i];    }    cout << endl;     // use erase to remove all but the first two and last three elements    // of the vector    alphas.erase( alphas.begin()+2, alphas.end()-3 );    // display the modified vector    for( vector<char>::size_type i = 0; i < alphas.size(); i++ ) {      cout << alphas[i];    
    cout << endl;

 output:

    ABCDEFGHIJ 
    ABHIJ 


 

#include <iostream>#include <vector>#include <iterator> using namespace std; int main(){    vector<char> alphas;    for( int i=0; i < 10; i++ ) {      static const char letters[] = "ABCDEFGHIJ";      alphas.push_back( letters[i] );    }     vector<char>::iterator iter = alphas.begin();    while( iter != alphas.end() )    {      if (*iter == 'B' || *iter == 'D')        iter = alphas.erase( iter );      else        ++iter;    }     copy(alphas.begin(), alphas.end(), ostream_iterator<char>(cout, ""));    cout << endl;  } 

output :

ACEFGHIJ 

原创粉丝点击