題:
介紹一下STL和包容器,如何實現?舉例實現vector。【美國某著名移動通信企業面試題】
答案:
C++的一個新特性就是采用了標准模版庫(STL)。所有主要編譯器銷售商現在都把標准模板庫作為編譯器的一部分進行提供。標准模板庫是一個基於模版的容器類,包括鏈表、列表、隊列和堆棧。標准模版庫還包含許多常用的算法,包括排序和查找。
標准模板庫的目的是提供對常用需求重新開發的一種替代方法。標准模板庫已經經過測試和調試,具有很高的性能並且是免費的。最重要的是,標准模板庫是可重用的。當你知道如何使用一個標准模板庫的容器後,就可以在所有的程序中使用它而不需要重新開發了。
容器是包含其他對象的對象。標准C++庫提供了一系列的容器類,它們都是強有力的工具,可以幫助C++開發人員處理一些常見的編程任務。標准模板庫容器類有兩種類型,分別為順序和關聯。順序容器可以提供對其成員的順序訪問和隨機訪問。關聯容器則經過優化關鍵值訪問它們的元素。標准模板庫在不同操作系統間是可移植的。所有標准模版庫容器類都在namespace std中定義。
舉例實現vector如下:
/ P94_example1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <vector> void print(std::vector<int>); int _tmain(int argc, _TCHAR* argv[]) { std::vector<int> vec; //定義一個空的容器 print(vec); vec.push_back(34); //添加一個成員 vec.push_back(23); //添加一個成員 print(vec); std::vector<int>::iterator p; //定義一個空的迭代器 p = vec.begin(); //指向容器的第一個成員 *p = 68; //修改第一個成員的值 *(p+1) = 69; //修改第二個成員的值 print(vec); vec.pop_back(); //刪除最後一個元素 print(vec); vec.push_back(101); //添加一個成員 vec.push_back(102); //添加一個成員 print(vec); vec[0] = 1000; //修改第一個成員的值 vec[1] = 1001; //修改第二個成員的值 vec[2] = 1002; //修改第三個成員的值 print(vec); return 0; } void print(std::vector<int> v) { std::cout<<"vector size is: "<<v.size()<<std::endl; //輸出向量的大小 //輸出容器 int i = 0; while(i < v.size()) std::cout<<v[i++]<<" "; std::cout<<std::endl<<std::endl; //std::vector<int>::iterator p = v.begin(); } // P94_example1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <vector> void print(std::vector<int>); int _tmain(int argc, _TCHAR* argv[]) { std::vector<int> vec; //定義一個空的容器 print(vec); vec.push_back(34); //添加一個成員 vec.push_back(23); //添加一個成員 print(vec); std::vector<int>::iterator p; //定義一個空的迭代器 p = vec.begin(); //指向容器的第一個成員 *p = 68; //修改第一個成員的值 *(p+1) = 69; //修改第二個成員的值 print(vec); vec.pop_back(); //刪除最後一個元素 print(vec); vec.push_back(101); //添加一個成員 vec.push_back(102); //添加一個成員 print(vec); vec[0] = 1000; //修改第一個成員的值 vec[1] = 1001; //修改第二個成員的值 vec[2] = 1002; //修改第三個成員的值 print(vec); return 0; } void print(std::vector<int> v) { std::cout<<"vector size is: "<<v.size()<<std::endl; //輸出向量的大小 //輸出容器 int i = 0; while(i < v.size()) std::cout<<v[i++]<<" "; std::cout<<std::endl<<std::endl; //std::vector<int>::iterator p = v.begin(); }