使用stlvector的幾種清空容器刪除辦法

時間 2021-09-04 02:34:23

1樓:day忘不掉的痛

先寫一個迴圈來迭代容器中的元素,如果迭代元素是要刪除的元素,則刪除之。

**如下所示:

vectorintcontainer;

for(vector::iterator is = intcontainer.begin(); it != intcontainer.end(); ++it)

。藉助remove演算法來達到刪除元素的目的。

vectorintcontainer;

size_t before_size = intcontainer.size();

remove(intcontainer.begin(), intcontainer.end(), 25);

size_t after_size = intcontainer.size();

執行程式以後發現before_size和after_size是一樣的,說明元素並沒有被真正刪除。寫出以上程式,是處於對remove演算法的不瞭解而致。stl中remove演算法會將不該刪除的元素前移,然後返回一個迭代器,該迭代器指向的是那個應該刪除的元素,僅此而已。

所以如果要真正刪除這一元素,在呼叫remove之後還必須呼叫erase,這就是stl容器元素刪除的"erase_remove"的慣用法。

vectorintcontainer;

intcontainer.erase( remove(intcontainer.begin(), intcontainer.

end(), 25), intcontainer.end());

erase-remove的慣用法適用於連續記憶體容器,比如vector,deque和string,它也同樣適用於list,但是並不是推薦的方法,因為使用list成員函式remove會更高效,

**如下:

listlist_int;

....

list_int.remove(25);

標準關聯容器沒有remove成員函式,使用stl演算法的remove函式時編譯同不過。所以上述remove形式對於標準關聯容器並不適用。

在這種情況下,解決辦法就是呼叫erase:

mapmapcontainer;

...mapcontainer.erase(25);

對於標準關聯容器,這樣的元素刪除方式是簡單有效的,時間複雜度為o(logn).

當需要刪除的不是某一個元素,而是具備某一條件的元素的時候,只需要將remove替換成remove_if即可

bool is2beremove(int value)

vectornvec;

listnlist;

....

nvec.erase(remove_if(nvec.begin(), nvec.end(), is2beremove), nvec.end());

nlist.remove_if(is2beremove);

刪除容器中具有特定值的元素:

如果容器是ector、string或者deque,使用erase-remove的慣用法。如果容器是list,使用list::remove。

如果容器是標準關聯容器,使用它的erase成員函式。

刪除容器中滿足某些條件的元素:

如果容器是ector、string或者deque,使用erase-remove_if的慣用法。如果容器是list,使用list::remove_if。

如果容器是標準關聯容器,使用remove_copy_if & swap 組合演算法。

2樓:笨笨

第一種辦法使用 clear ,清空元素,但不**空間

vecint.clear();

j=vecint.capacity();//j=512i=vecint.size();//i=0第二種辦法使用 erase迴圈刪除,結果同上vector

iteratoriter=vecint.begin();for(;iter!=vecint.

end();)j=vecint.capacity();//j=512i=vecint.size();//i=0

erase在每次操作時,迭代器指標會整體前移1,就是每次都會搬全部資料,所以vector不適合做頻繁刪除的容器

第三種辦法 最簡單的使用swap,清除元素並**記憶體vector

.swap(vector

; 另一種寫法

j=vecint.capacity();//j=0i=vecint.size();//i=0該語句是由vector

swap(vecint)的變體而來,一下解釋引自csdn:

std::vector

第二句把v和temp交換

然後temp就自動解析掉了

這樣寫的作用是:把v的容量縮小到最佳值

該例中執行這句時,

c++中stl的vector容器的解構函式怎麼用?

3樓:

解構函式不需

bai要直接呼叫。而du

是在物件失效時zhi自動呼叫的。所謂物件失dao效,是指程式已經執行版出區域性變數權的作用域或者是對物件指標進行delete時。

比如void foo()

//當此函式執行結束時,自動呼叫array的解構函式~vector()。

4樓:匿名使用者

c++中stl的vector容器抄的解構函式不用自己呼叫襲,系統會進行析構,但是vector內元素的清空需要手動進行。

非指標的資料型別,比如 int、string、char ,還包括自定義的資料結構、自定義的類 等等只需要手動呼叫vector的clesr函式就可以了,空間的釋放和析構系統都會自動進行。

指標型別的資料,這種情況需要手動進行釋放。也就是說new 產生的記憶體需要手動使用free進行釋放。

5樓:匿名使用者

提供你一個辦法:

在檔案中,下一個斷點

~vector()

看看會不會執行到,這樣,你就知道,你不必自己呼叫 ~vector(),系統會做的。

我的機器上,是第 386 行。試試看

6樓:匿名使用者

這裡不需要手動釋抄放,如樓上幾位所說。我說說解構函式呼叫的時機吧!

記憶體管理應該明白吧!

這裡你的vector是在棧上的,所以main函式執行完後,會自動對棧進行**,對棧進行**時,會自動呼叫vector物件的解構函式,因此不需要顯式呼叫。

7樓:匿名使用者

~vector();不需要你呼叫,呼叫會出錯,程式會自動呼叫的,

c++ stl刪除vector中指定元素

8樓:匿名使用者

心情好+沒事做

這很難嗎?不就是用遊標取出然後做一個value比較嗎?有什麼糾結的?

for (std::vector::iterator iter1 = dvcardreject.

begin(); iter1 != dvcardreject.end(); ++iter1)

else }}

9樓:匿名使用者

class function

};for(int i=0;i

stl中map,vector等需要手動清空嗎

10樓:匿名使用者

如果儲存的不是指標,沒有問題。stl有自己的記憶體管理,他們都是物件,過了生存期後他們會自己析構已經分配的空間。

c++ stl vector erase函式中,有沒有重新分配記憶體?

11樓:匿名使用者

沒有重新分配。但是後續的元素被往前移動,因此被刪除的元素之後的迭代器會失效。例如,下面的**在debug模式下將會崩潰,在release模式下正常執行而且可以看到陣列的地址並沒有改變。

#include

#include

int main();

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(v));將v複製到新的向量中(這個向量的容量正好和v的大小一樣),然後與v進行交換。因為這是一個區域性變數,所以這句話結束時會將從v處獲得的記憶體釋放。

同時,v在交換之後,容量和大小一致。

建議你看一下源**,或者單步除錯看看具體的執行過程。

民族使用的文字約幾種,56個民族使用的文字約幾種

56個民族使用的語言,約有80種以上。較多的民族只使用一種語言,但也有些民族說兩種或兩種以上的語言。例如 裕固族說兩種語言,一種是屬於突厥語族的西部裕固語,另一種是屬於蒙古語族的東部裕固語。瑤族說三種語言,絕大部分人說屬於苗瑤語族瑤語支的勉語,小部分人說屬於苗瑤語族瑤語支的布努語,另一小部分人說屬於...

民族使用的文字約幾種,56個民族使用的文字約幾種

牟蝶孟胭 目前我國56個民族使用的文字約有39種。56個民族使用的文字約幾種?5 56個民族使用的語言,約有80種以上。較多的民族只使用一種語言,但也有些民族說兩種或兩種以上的語言。例如 裕固族說兩種語言,一種是屬於突厥語族的西部裕固語,另一種是屬於蒙古語族的東部裕固語。瑤族說三種語言,絕大部分人說...

土地使用權的獲得方式有幾種,國有土地使用權取得方式有哪幾種

土流集團 土地使用權是指國家機關 企事業單位 農民集體和公民個人,以及三資企業,凡具備法定條件者,依照法定程式或依約定對國有土地或農民集體土地所享有的佔有 利用 收益和有限處分的權利。土地使用權是外延比較大的概念,這裡的土地包括農用地 建設用地 未利用地的使用權。土地使用權的獲得和交易方式有哪些?土...