STL學習筆記(1)
阿新 • • 發佈:2020-12-03
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; }