第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

請問erase函數(shù)有沒有重新分配內(nèi)存?

請問erase函數(shù)有沒有重新分配內(nèi)存?

C++
有只小跳蛙 2023-04-22 18:14:50
1 erase函數(shù)有沒有重新分配內(nèi)存,釋放原有數(shù)組空間?2 v.erase( remove( v.begin(), v.end(), 0) , v.end() )請問這個(gè)有沒有重新分配內(nèi)存?為何我這教程上說,即使用先前的迭代器也不會出現(xiàn)訪問到不存在元素的錯誤(這意思就是說,沒有重新分配內(nèi)存?)3 教程里還說,為了實(shí)現(xiàn)刪除元素后容器自動縮小,每次erase后,向量要重新分配內(nèi)存,并復(fù)制所有元素。這極大的影響性能。因?yàn)闃?biāo)準(zhǔn)庫把釋放內(nèi)存的選擇交給了程序員,讓程序員選擇放還是不放。你可以使用v.swap(vector<T>(v)) 來釋放多余的內(nèi)存。對于第3點(diǎn),有疑問:1、erase既然重新分配了,難道他沒有自動釋放原來的空間?如果自動釋放了,那么從何而來的讓程序員決定是否釋放?2、swap是交換,跟釋放多余的空間,在這里扯上什么關(guān)系?
查看完整描述

1 回答

?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊

沒有重新分配。但是后續(xù)的元素被往前移動,因此被刪除的元素之后的迭代器會失效。例如,下面的代碼在debug模式下將會崩潰,在release模式下正常運(yùn)行而且可以看到數(shù)組的地址并沒有改變。


#include <vector>#include <iostream> int main(){    std::vector<int> v{ 1, 2, 3, 4, 5, 6, 7 };    auto p = v.end() - 2;     std::cout << &v[0] << "\t" << *p << "\t" << &*p << "\n";    v.erase(v.begin() + 2);    std::cout << &v[0] << "\t" << *p << "\t" << &*p << "\n";     return 0;}

v.swap(vector<T>(v));將v復(fù)制到新的向量中(這個(gè)向量的容量正好和v的大小一樣),然后與v進(jìn)行交換。因?yàn)檫@是一個(gè)局部變量,所以這句話結(jié)束時(shí)會將從v處獲得的內(nèi)存釋放。同時(shí),v在交換之后,容量和大小一致。

建議你看一下源代碼,或者單步調(diào)試看看具體的執(zhí)行過程。


查看完整回答
反對 回復(fù) 2023-04-25
  • 1 回答
  • 0 關(guān)注
  • 146 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號