vector--C++ STL 學習
vector對應的數據結構為數組,而且是動態數組,也就是說我們不必關心該數組事先定義的容量是多少,它的大小會動態增長。與數組類似的是,我們可以在末尾進行元素的添加和刪除,也可以進行元素值的隨機訪問和修改。
??vector是STL中最常見的容器,它是一種順序容器,支持隨機訪問。vector是一塊連續分配的內存,從數據安排的角度來講,和數組極其相似.
??不同的地方就是:數組是靜態分配空間,一旦分配了空間的大小,就不可再改變了;而vector是動態分配空間,隨著元素的不斷插入,它會按照自身的一套機制不斷擴充自身的容量。
??vector的擴充機制:按照容器現在容量的一倍進行增長。vector容器分配的是一塊連續的內存空間,每次容器的增長,並不是在原有連續的內存空間後再進行簡單的疊加,而是重新申請一塊更大的新內存,並把現有容器中的元素逐個復制過去,然後銷毀舊的內存。這時原有指向舊內存空間的叠代器已經失效,所以當操作容器時,叠代器要及時更新。
首先要引入頭文件 #include
(1)vector的創建
vector<int> vec1; // 創建一個空的vector
vector<int> vec2(vec1); // 創建一個vector vec2,並用vec1去初始化vec2
vector<int> vec3(10); // 創建一個含有n個數據的vector
vector<int> vec4(10,0); // 創建含有10個數據的vector,並全部初始化為0
構造函數進行了重載,可以用多種方式創建vector。
(2)push_back(), pop_back()添加刪除元素
// 在vector尾部添加元素
vec1.push_back(4);
// 在vector尾部刪除元素
vec1.pop_back();
// 在vector頭部添加元素,無法完成,因為vector的數據結構為數組,無法在頭部插入元素,否則需要整個數組前移;
// 在vector頭部刪除元素,無法完成,理由同上。
可以使用push_back()不斷的在vector尾部添加元素,使用pop_back刪除尾部元素。操作非常的方便,比我們直接用數組結構方便多了。
(3)[],at(),取某位置的元素值
// 取vector中某位置的元素值 cout << "在1位置的元素值為:" << vec1.at(1) << endl; cout << "在1位置的元素值為:" << vec1[1] << endl;
因為vector的數據結構就是一個數組,所以可以進行隨機訪問。
(4)begin(),end(),指向頭元素、尾元素的指針
void PrintVector(vector<int> ve)
{
cout << "Vector中的數據為:";
vector<int>::iterator veIterator;
for (veIterator = ve.begin(); veIterator < ve.end(); veIterator++)
{
cout << *veIterator << " ";
}
cout << endl;
}
可以把叠代器理解為指針,把begin(),end()分別理解為頭指針和尾指針。這樣就能訪問到vector中的每一個元素了。
(5)back(),front(),訪問頭部元素和尾部元素
// 返回尾部數據的引用
cout << "尾部數據的值為:" << vec1.back() << endl;
// 返回頭部數據的引用
cout << "頭部數據的值為:" << vec1.front() << endl;
(6)max_size(),最大容納量;size(),當前的元素個數。
cout << "vector中的最大容量為:" << vec1.max_size() << endl;
cout << "vector中的元素個數為:" << vec1.size() << endl;
(7)empty(),判斷vector是否為空
cout << "vector是否為空:" << vec1.empty() << endl;
如果為空,返回1.否則返回0。
(8)swap():交換兩個vector中的值。
(9)sort():對vector升序排序;reverse():對vector降序排序。
// 對vector進行升序排序
sort(vec1.begin(), vec1.end());
// 對vector進行降序排序
reverse(vec1.begin(), vec1.end());
傳遞的參數是需要排序的範圍,因為這裏要對整個vector排序,所以參數分別指向頭部和尾部。
(10)[],at():修改元素
// 修改vector中的某個值
vec1[2] = 99;
vec1.at(3) = 88;
(11)erase():刪除某個元素
// 刪除數組的某個元素
// 為什麽要使用iterator來進行定位,因為數組如果要刪除一個元素或者插入一個元素,會導致其他元素移動,所以不能直接進行刪除
vector<int>::iterator vItera = vec1.begin();
vItera = vItera + 2;
vec1.erase(vItera);
在刪除元素時,要借用叠代器。
(12)insert(): 插入元素
// vector插入某元素,要使用iterator來定位某個位置
vector<int>::iterator vInsert = vec1.begin();
vInsert = vInsert + 2;
vec1.insert(vInsert, 777);
同樣要借助叠代器。
(13)clear():清除所有元素
// 清除所有數據
vec1.clear();
cout << "vector是否為空:" << vec1.empty() << endl;
執行以後就是一個空的vector,不包含任何元素。
關於vector的更詳細介紹可以參考文檔:http://en.cppreference.com/w/cpp/container/vector
vector--C++ STL 學習