天天看點

c++ primer學習劄記_vector,疊代器

一 vector容器

      vector 是同一種類型的對象的集合,每個對象都有一個對應的整數索引值,vector 稱為容器,是因為它可以包含其他的對象。

二 vector對象的定義和初始化

1.vector初始化的幾種方式  

vector<T> v1;//預設構造函數為空
vector<T> v2(v1);//v2是v1的一個副本
vector<T> v3(n,i);//v3包含n個值為i的元素
vector<T> v4(n);//v4含有值初始化的元素的n個副本
           

注:vector對象的重要屬性就在于運作時可以高效率的動态增長,在元素值已知的情況下最好是動态地添加元素

2.值初始化

   如果沒有指定元素的初始化式,标準庫将自行提供一個元素初始值進行值初始化,具體的值取決于存儲的vector的元素的資料類型。

三 vector對象的操作

v.empty();//判斷是否為空
v.size();//傳回vector裡面的元素的個數,和string對象一樣,傳回值是:vector<T>::size_type
v.push_back(t);//在v的末尾增加一個值為t的元素
v[n];//傳回v中位置為n的元素
v1=v2;//把v1的元素替換為v2中元素的副本
v1==v2;//如果v1與v2相等,則傳回true
!=,<,<=,>,>= //保持這些操作的慣有含義

           

1.向vector中添加元素

#include<iostream>
#include<vector>
    using namespace std;
int main()
{
    vector<int> a;
    cout<<a.size()<<endl;
    a.push_back(2);
    cout<<a[0]<<endl;
    a.push_back(3);
    cout<<a[1]<<endl;
    cout<<a.size();
    return 0;
} 
           

2.vector的下标操作隻能傳回對應位置的元素,不能添加元素

vector <int> a;
for(vector<int >::size_type ix=0;ix!=10;++ix)
     a[ix]=ix;
           

上面這段程式會發生錯誤,a是空的vector對象,不能用下标來添加元素

正确的寫法是

vector <int> a;
for(vector<int >::size_type ix=0;ix!=10;++ix)
     a.push_back(ix);
           

四 疊代器

   标準庫為每一種容器定義了一種疊代器類型。疊代器類型提供了比下标操作更通用的方法。

   1.vector 容器的疊代器   vector<T>::iterator  iter;

   2.begin和end    

vector<int> a;
vector<int >::iterator iter;
iter=a.begin();

           

上述語句把iter初始化為a[0](假設vector不空)

由end操作傳回的疊代器指向vector的末端元素的下一個。通常稱為超出末端疊代器,表明它指向了一個不存在的元素。如果vector為空,begin傳回的疊代器與end傳回的疊代器類型相同。

3. vector 疊代器的自增和解引用

   疊代器類型可使用解引用操作符來通路疊代器所指向的元素。

   疊代器使用自增操作來指向下一個元素

4. const_iterator

    每種容器類型還定義了一種名為 const_iterator的類型,該類型隻能用于讀取容器内的元素,但不能改變其值。

//text是vector<string>類型
for(vector<string>::const_iterator iter=text.begin();iter!=text.end();++iter)
    cout<<*iter<<endl;
           

    上面的代碼是正确的

//text是vector<string>類型
for(vector<string>::const_iterator iter=text.begin();iter!=text.end();++iter)
    *iter='"    ";
           

錯誤,不能改變const_iterator的值

注:不要混淆了const_iterator 和const 的iterator,聲明一個const疊代器必須初始化疊代器,一旦被初始化就不能改變它的值。

vector<int> nums(10);
const vector<int>::iterator cit=nums.begin;
*cit=1;//正确
++cit;//錯誤,不能堆const疊代器指派
           

繼續閱讀