通用算法簡介

vector向量模板類能夠稱爲容器。c++的容器只能存放一種類型的變量和對象。可是這些容器的容量能夠隨着須要變大或者縮小。ios

--------------------c++

假設c是vector 要刪除c中的某個元素算法

c.erase(n);n不能用整數,必須是迭代器;不然就會報錯,不過能夠這樣c.erase(c.begin()+n);數組

-------------------------函數

1。序列的各種

STL處處可見容器的概念,常見的stl序列容器有六種。spa

deque 雙向隊列,能夠在隊列兩端自由刪除和增長元素。  double end queue.net

list:單向鏈表。指針

queue: 隊列,只能刪除第一個元素,而且只能在最後位置插入元素的結構。  // 在queue中不存在插隊的狀況,不能刪除最後一個元素?htm

priority_queue: 優先隊列,能夠保證隊列中的元素始終保持有序。對象

stack: 棧

vector: 向量,能夠放置任何數據類型的容器

以上列舉的都是序列,序列的一個基本特徵是能在序列中添加元素和刪除元素。

 

2.auto_ptr類的使用

auto_ptr是一個模板類,用於管理動態內存分配的用法,auto_ptr是一種智能指針,智能指針是這樣一種類,它的對象特徵相似於指針,它同時是一個類,所以它能夠修改或擴充簡單指針的行爲。

auto_prt自動回收分配的內存功能和使用new 關鍵字分配內存不能自動回收的狀況。

3. Vector

C++ vector的用法小結_C 語言_腳本之家
http://www.jb51.net/article/44234.htm

std::vector的幾種遍歷方式比較 - ls306196689的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/ls306196689/article/details/35787955

STL基礎5:vector容器的使用總結 - 爛筆頭的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/longhuahaha/article/details/8373505

STL——for_each的用法 - - 博客頻道 - CSDN.NET
http://blog.csdn.net/lalor/article/details/7746505

 

#include <iostream>
#include <vector>
#include<algorithm> //由於要用到排序算法,因此要添加此頭文件。 
using namespace std;

template<typename T>
void showVec(vector<T> vec){
    for(int i=0;i<vec.size();i++){ 
        //下面之因此能夠用[],是由於向量的模板類中重載了[]運算符。
        cout<<vec[i]<<" ";//這裏其實有點小bug,可能T類型並無重載<<運算符
    }
    cout<<endl;
}

int main(){
    std::vector<int> vec;
    for(int i=0;i<10;i++){
        vec.push_back(i);
    }
   
    for(int i=0;i<vec.size(); i++){
        cout<<vec[i]<<" ";
    }

 

    //向量迭代器的定義和使用  iterator自己是在vector<>裏用typedef定義的一個類型,而不是一個字段。
    //typedef的類型定義也是有做用域的,因此下面iterator前有std::vector<int>::
    std::vector<int>:: iterator iter;  //iterator是一個複合數據類型

    //向量中begin和end函數分別返回的是向量的第一個元素以及最後一個元素的後一位的元素的迭代器。
    //迭代器能夠理解爲一個指針。具備指針的一切特性。
    //這也是爲何能夠對begin()函數的返回值加一個整型數。

    //若是說指針是個簡單的地址指向,那麼迭代器可能 說是複雜的地址指向,不只能夠指向其餘元旦,而本身自己也是個類對象。


    for(iter=vec.begin();iter<vec.end();iter++){   //寫的時候儘可能使用!=比較迭代器,由於對於不少非隨機迭代器不支持<這個操做符。
        //像endl、hex、oct等一系統用在cout語句中的符號本質上都是函數,但它們不侷限於某個類,是自由函數。
        //endl的定義實質上是一個實例化的模板函數,或者稱爲隱式實例化的模板函數。
        cout<<*iter<<std::endl; 
    }

    int ar[]={2,3,6,78};
    std::copy(ar,ar+4,vec.begin());  //copy是用ar數組的值覆蓋從vec開頭指定長度的數據。
       
    vec.pop_back();

    //調用通用算法對vector進行排序。
    std::sort(vec.begin(),vec.end());  //注意雖然endb函數並非指向vector最後一個元素,但第二個參數用的還是end.

    showVec(vec);
    //在vec的開頭插入12
    vec.insert(vec.begin(),12);
    showVec(vec);
    vec.insert(vec.begin()+3,2,0);
    showVec(vec);
    //vec.begin()指向第一個元素,下面的語句將第4個到第7個元素複製到從第5個元素開始的位置,並將原來的第5個元素及後面相應的元素接在後面。
    vec.insert(vec.begin()+4,vec.begin()+3,vec.begin()+6);  //不能直接像數組同樣用整數下標。
    showVec(vec);

    vec.clear();
    showVec(vec);
    //char ch;
    //ch=cin.get();               //或者cin.get(ch);
    //cin>>noskipws>>input[j];//不想略過空白字符,那就使用 noskipws 流控制
    cin.get();  //這種狀況用於使控制檯窗口停住或接收多餘的空字符。
    return 0;
}

4.copy函數

//int ar[6]={……}    vector<int>::iterator pv;

std::copy(ar,ar+5,pv);   //將ar數組的內容拷貝到pv迭代器指向的容器中。

相關文章
相關標籤/搜索