結構體的vector resize()與初始化

序:
咱們在使用vector的時候能夠自定義裏面的數據類型。例如這樣:css

struct Edge{
    int from;
    int to;
    int weight;
};
vector<Edge> edge;

使用vector的使用咱們有時會用到resizereserve函數進行內存的分配。在以前的測試中咱們發現先使用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);

明顯簡潔了不少。

fread讀入優化,尋找速度極限


自此結束。

箜瑟_qi 2017.04.22 11:35

相關文章
相關標籤/搜索