vector簡介
vector是STL中最常見的容器,它是一種順序容器,支持隨機訪問。vector是一塊連續分配的內存,從數據安排的角度來講,和數組極其相似,不同的地方就是:數組是靜態分配空間,一旦分配了空間的大小,就不可再改變了;而vector是動態分配空間,隨着元素的不斷插入,它會按照自身的一套機制不斷擴充自身的容量。
vector的擴充機制:按照容器現在容量的一倍進行增長。vector容器分配的是一塊連續的內存空間,每次容器的增長,並不是在原有連續的內存空間后再進行簡單的疊加,而是重新申請一塊更大的新內存,並把現有容器中的元素逐個復制過去,然后銷毀舊的內存。這時原有指向舊內存空間的迭代器已經失效,所以當操作容器時,迭代器要及時更新。
vector的數據結構
vector數據結構,采用的是連續的線性空間,屬於線性存儲。他采用3個迭代器_First、_Last、_End來指向分配來的線性空間的不同范圍,下面是聲明3個迭代器變量的源代碼。
template<class _Ty, class _A= allocator< _Ty> >
class vector{
...
protected:
iterator _First, _Last, _End;
};
vector對象的操作
vector標准庫提供了許多類似於string對象的操作,如下所示是一部分:
| 操作調用方式 |
操作說明 |
| v.empty() |
判斷v是否為空 |
| v.size() |
返回v中元素的個數 |
| v.push_back(t) |
向v的末尾添加一個元素 |
| V[n] |
返回v中位置為n的元素 |
| V1 = v2 |
把v1中元素替換為v2中元素副本 |
| V1==v2 |
判斷是否相等 |
| !=, <, <=, >, >= |
直接用於vector對象的相互比較 |
1.push_back 在數組的最后添加一個數據
2.pop_back 去掉數組的最后一個數據
3.at 得到編號位置的數據
4.begin 得到數組頭的指針
5.end 得到數組的最后一個單元+1的指針
6.front 得到數組頭的引用
7.back 得到數組的最后一個單元的引用
8.max_size 得到vector最大可以是多大
9.capacity 當前vector分配的大小
10.size 當前使用數據的大小
11.resize 改變當前使用數據的大小,如果它比當前使用的大,者填充默認值
12.reserve 改變當前vecotr所分配空間的大小
13.erase 刪除指針指向的數據項
14.clear 清空當前的vector
15.rbegin 將vector反轉后的開始指針返回(其實就是原來的end-1)
16.rend 將vector反轉構的結束指針返回(其實就是原來的begin-1)
17.empty 判斷vector是否為空
18.swap 與另一個vector交換數據
注,以下是一些需要注意的地方
Ø vector和string一樣,長度、下標等類型是size_type,但是vector獲取size_type時,需要指定類型,如vector<int>::size_type這樣的方式
Ø vector的下標操作,例如v[i],只能用於操作已經存在的元素,可以進行覆蓋、獲取等,但是不能通過v[i++]這種方式來給一個vector容器添加元素,該功能需要用push_back操作完成,下標不具備該功能
Ø C++程序員習慣優先使用!=而不是<來編寫循環判斷條件
map對象的定義和初始化
map是鍵-值對的組合,有以下的一些定義的方法:
map<k, v> m;map<k, v> m(m2);map<k, v> m(b, e);
上述第一種方法定義了一個名為m的空的map對象;第二種方法創建了m2的副本m;第三種方法創建了map對象m,並且存儲迭代器b和e范圍內的所有元素的副本。
map的value_type是存儲元素的鍵以及值的pair類型,鍵為const。
3、map對象的一些基本操作
3.1、map中元素的插入
在map中元素有兩種插入方法:
- 使用下標
- 使用insert函數
在map中使用下標訪問不存在的元素將導致在map容器中添加一個新的元素。
insert函數的插入方法主要有如下:
m.insert(e)m.insert(beg, end)m.insert(iter, e)
上述的e一個value_type類型的值。beg和end標記的是迭代器的開始和結束。
兩種插入方法如下面的例子所示:
#include <stdio.h> #include <map> using namespace std; int main(){ map<int, int> mp; for (int i = 0; i < 10; i ++){ mp[i] = i; } for (int i = 10; i < 20; i++){ mp.insert(make_pair(i, i)); } map<int, int>::iterator it; for (it = mp.begin(); it != mp.end(); it++){ printf("%d-->%d\n", it->first, it->second); } return 0; }
map中元素的查找和讀取
注意:上述采用下標的方法讀取map中元素時,若map中不存在該元素,則會在map中插入。
因此,若只是查找該元素是否存在,可以使用函數count(k),該函數返回的是k出現的次數;若是想取得key對應的值,可以使用函數find(k),該函數返回的是指向該元素的迭代器。
上述的兩個函數的使用如下所示:
#include <stdio.h> #include <map> using namespace std; int main(){ map<int, int> mp; for (int i = 0; i < 20; i++){ mp.insert(make_pair(i, i)); } if (mp.count(0)){ printf("yes!\n"); }else{ printf("no!\n"); } map<int, int>::iterator it_find; it_find = mp.find(0); if (it_find != mp.end()){ it_find->second = 20; }else{ printf("no!\n"); } map<int, int>::iterator it; for (it = mp.begin(); it != mp.end(); it++){ printf("%d->%d\n", it->first, it->second); } return 0; }
從map中刪除元素
從map中刪除元素的函數是erase(),該函數有如下的三種形式:
m.erase(k)m.erase(p)m.erase(b, e)
第一種方法刪除的是m中鍵為k的元素,返回的是刪除的元素的個數;第二種方法刪除的是迭代器p指向的元素,返回的是void;第三種方法刪除的是迭代器b和迭代器e范圍內的元素,返回void。
如下所示:
#include <stdio.h> #include <map> using namespace std; int main(){ map<int, int> mp; for (int i = 0; i < 20; i++){ mp.insert(make_pair(i, i)); } mp.erase(0); mp.erase(mp.begin()); map<int, int>::iterator it; for (it = mp.begin(); it != mp.end(); it++){ printf("%d->%d\n", it->first, it->second); } return 0; }
