序:
咱們在使用vector的時候能夠自定義裏面的數據類型。例如這樣:css
struct Edge{
int from;
int to;
int weight;
};
vector<Edge> edge;
使用vector的使用咱們有時會用到resize和reserve函數進行內存的分配。在以前的測試中咱們發現先使用resize再用下標訪問讀取數據的效率要遠遠高於push_back()(測試結果見下),因此resize函數在初始化的時候會被使用。
關於vector push_back()與其餘方式讀取數據的效率對比
可是當咱們真的調用resize函數的時候,編譯器會報錯:html
edge.resize(0); ---
[Error] no matching function for call to 'Edge::Edge()'
[Note] candidates are:
難道是調用resize的時候格式出了問題嗎?
可是卻發現下面的:數組
vector<int> arc[maxn];
arc[i].resize(0);
卻沒有任何問題。
那麼自定義結構體與int這類數據類型到底哪裏不一樣?markdown
後來咱們發現加上它就不會報錯了:函數
struct Edge{
int from;
int to;
int weight;
Edge(){} /* 重點在這裏 */
Edge(int f, int t, int w):
from(f), to(t), weight(w){}/* 這個不是重點 */
};
原來當執行resize的時候,若是咱們將它擴大,編譯器會自動將剩下的部分初始化。int的初始化爲0,可是咱們自定義的結構體沒有初始化函數。因此它沒法執行。
相似的,當咱們直接聲明一個結構體數組的時候:測試
Edge edge[maxn];
發生報錯的緣由也在於此,因爲vector在聲明的時候不會執行初始化因此沒有報錯。可是聲明一個數組,編譯器會將整個數組初始化,這就須要你手寫一個初始化的函數。(能夠是空,也能夠在裏面寫你要的特殊初始化,可是必需要有)並且這個初始化的函數參數是空的,函數名就是結構體的名字(你初始化的時候沒有參數),跟普通的函數一個意思,只不過是寫在告終構體的內部。優化
那麼再看下面不是重點的那兩行代碼:ui
Edge(int f, int t, int w):
from(f), to(t), weight(w){}
這個就是有參數的初始化了。當你讀入多個數據構造結構體的時候,這樣作會讓代碼很簡潔。
不用的話是這樣的:spa
n = Get_Int(), m = Get_Int(), we = Get_Int();//讀入優化
edge[i].from = n;
edge[i].to = m;
...
有了它代碼會是這樣的:code
n = Get_Int ...; /* 輸入同上 */
edge[i] = Edge(n, m, we);
明顯簡潔了不少。
自此結束。
箜瑟_qi 2017.04.22 11:35