1class
a 10 a(const a&a)
11: m_x(a.m_x)
1215 };
1void
solve()
2
1output:
23 a(int
)4 a(const a&)
5 a(int
)6 a(const a&)
7 a(const a&)
8 a(int
)9 a(const a&)
10 a(const a&)
11 a(const a&)
對於上述結果 v.push_back(a(i)),進行了三步操作
①a(1) 建立匿名例項
②對於該匿名例項,v中第一塊未使用的記憶體實行" a(const a& a) ",拷貝構造操作
③vector申請的記憶體是動態改變的,如果 v 執行 push_back操作,發現申請的記憶體已滿,則會申請一塊比原先記憶體大的連續記憶體,然後依次進行拷貝構造,之後拋棄原先的記憶體
從③可以得知,我們如果知識生氣了乙個vector,不設定其申請的記憶體大小,則它會依據壓入資料大小動態申請,拷貝,拋棄原先記憶體的操作,
如果我們得知我們需要大概的 int 個數,則我們可以手動設定vector的大小,防止vector申請記憶體不夠而出現上述情況
1void
solve()
2
1output:
2 a(int
)3 a(const a&)
4 a(int
)5 a(const a&)
6 a(int
)7 a(const a&)
可以從 output 看出,我們確實優化了vector相關記憶體和拷貝操作
進一步,從①②中可以,我們其實額外申請了記憶體,然後再對vector的記憶體對申請的臨時的例項拷貝構造,然後丟棄臨時例項,這樣不省事也不省時
為了解決這個情況,vector 提供了 emplace_back函式,實現直接對vector中對未使用的記憶體進行初始化構造操作,傳入的數值對應於初始化列表或者根據有參建構函式進行操作
1void
solve()
2
output:a(int)
a(int)
a(int)
這樣,我們使用vector時,效率會高很多,而且優化也不會很複雜
關於vector的使用
vector在做push back的操作的時候如果預置空間不足寫入,則會重新申請記憶體,並把之前的資料拷貝過來。因此當乙個vector物件要做大量push back操作的時候,如果知道要push進去的數量,最好先用reserve開闢好空間,效率會高很多。再者,使用vector的時候要慎重使用引用。如...
關於vector的排序
vector buildstoreys 按樓層排序 方法1 map mapstoreys for auto istorey buildstoreys buildstoreys.clear auto iter mapstoreys.begin while iter mapstoreys.end 按樓層...
關於vector的用法
1.標頭檔案 include 2.用法 1.vectorb 只是代表著 建立了乙個vector的空的物件 別以為這時候的b 0 b 1 等於0 天真。2.vectorv3 10,0 建立乙個有10個元素0的容器 這個時候b 0 0 b 9 0!這個跟陣列一樣 還是會超時 如果你申請的比較大的話 一般...