1. 程式人生 > 實用技巧 >STL學習筆記(1)

STL學習筆記(1)

C++ STL學習筆記

函式模板

有效的降低開發成本,減少出錯概率
編譯時多型,提高靈活性
引數化程式設計
STL容器 vector,stack,deque,map,set
利用模板實現一個簡單的容器類

template<typename T>
class TVector
{
    private:
     typedef T  Tem;
     typedef T * pTem;
     
     pTem pHeadAarry;//首地址
     int  maxNum;//數量
     int  mIndex;//便利序號
     int  mEnd;
    
    public:
     TVector(int Len=0):maxNum(Len),mIndex(0),mEnd(0)
     {
         if (Len >0 )
         {
              pHeadAarry = new Tem[Len];
         }
     }
     ~Tvector()
     {
         delete[] Tem;//釋放記憶體地址空間
     }

     bool push_back(const Tem &value)
     {
         
         if (mEnd< maxNum)
         {
             Tem[mEnd] = value;
             mIndex++;
             mEnd++;
             return true;
         }
         return false;

     }
     
     Tem pop_back()
     {
         mIndex--;
         if (mIndex>=0)
         {
             return Tem[mIndex];
         }
         return NULL;
     }

    Tem & operator[](int index)
    {
        if (index<mEnd || index > =0)
        {
            return Tem[index];
        }
        return NULL;
    } 
}

STL 六大部件

容器

auto 關鍵字,在編譯的時候由編譯器確定變數型別,方便程式設計師

std::vector<int> vec
....
//在編譯的時候由編譯器確定elem為迭代器
for(auto elem:vec)
{
    std::cout<<elem<<std::endl;
}

STL 容器用來存放資料,演算法用來處理資料,不在一個class,這點和oop思想不太一樣,這就是模板程式設計,迭代器是容器和演算法的橋樑,每種容器都有對應的迭代器

#include <vector>
#include <iostream>

int main()
{ 
    int[7] vi={12,16,88,49,88,456,123}
    //vector容器模板 allocator分配器 實現對容器的記憶體分配
    //vi.begin()迭代器,範法指標,指標能幹的都能幹
    //allocator<int>引數不寫,每個容器內都會呼叫預設allocator分配器
    //迭代器是容器和演算法之間的橋樑。
    vector<int,allocator<int>> pV(vi,vi+7);
    
    //count_if 是STL中提供的演算法,求出滿足條件的容器中的值的  數量
    //bind2nd less<int> 仿函式
    cout<< count_if(pV.begin,pV.end,not1(bind2nd(less<int>(),40)));
}

c++ 11 將array包裝為一個class,連續的空間

    #include <iostream>
    #include <array>
    using namespace std;

    #define MAX_NUM 500000
    array<int, MAX_NUM> mArray;

    int compare(const void* a, const void* b)
    {
        int* pa = (int*)a;
        int* pb = (int*)b;
        return (*pa) - (*pb);  //從小到大排序
    }

    int main() 
    {
        clock_t mtime;
        //設定種子
        srand((unsigned)time(NULL));
        //獲取到目前的執行時間
        mtime = clock();
        //向array中新增隨機數
        for (int i = 0; i < MAX_NUM; i++) 
        {
            mArray[i] = rand();
        }
        cout <<"執行時間ms:"<<(clock() - mtime);

        //排序時間
        mtime = clock();
        qsort(mArray.data(), MAX_NUM,sizeof(int), compare);
        cout << "排序時間ms:" << (clock() - mtime);
        //查詢時間
        int  tag = 0;
        mtime = clock();
        void *res=bsearch(&tag, mArray.data(), MAX_NUM, sizeof(int), compare);
        cout << "查詢時間ms:" << (clock() - mtime);
        cout << mArray.data();
        cout << mArray.front();
        cout << mArray.back();
        cout << mArray.size();
        system("pause");
        return 0;
    }