[英]How should I delete objects in a vector
我正在制作一個使用std :: vector來容納一堆對象的程序。
std::vector<Ball> balls;
for (int i = 0; i < ball.size(); ++i){
if (...some condition...){
//How should I delete balls[i]
}
如果我這樣做
std::vector<Ball> balls;
//put a bunch of balls in balls
for (int i = 0; i < ball.size(); ++i){
if (...some condition...){
balls.erase(balls.begin() + i);
}
每個球都沒有動態分配的內存,那么這會完全清除球[i]嗎? 我不必擔心公羊存在的那只球嗎?
感謝所有的幫助!
“每個球都沒有動態分配的內存,所以這會完全清理
balls[i]
嗎?balls[i]
?我永遠不必擔心滑枕上存在的球嗎?”
是的,您不必擔心Ball
類實例,但是內存管理由內部的std::vector<>
類完成。 因此,這並不意味着std::vector<>
會自動縮小為刪除的項目動態分配的內存。
使用當前的標准,您可以在刪除了幾項后使用std::vector<>::shrink_to_fit()
來建議實現。
我想你是說以下
#include <vector>
#include <algorithm>
//...
std::vector<Ball> balls;
//...
balls.erase( std::remove_if( balls.begin(), balls.end(),
[] ( const Ball &b ) { return somecondition( b ); } ),
balls.end() );
方法擦除將為向量的所有擦除元素調用析構函數。 實際上,該類調用了放置釋放函數。
您可能需要應用delete_remove習慣用法進行條件清理:
balls.erase(std::remove_if(balls.begin(), balls.end(),
[] (const Ball& el) { //write your condition here;})balls.end());
首先,在向量上調用erase()
時,該類型的析構函數的調用次數等於被擦除的元素的數量(C ++ 11 23.3.7.5.5)。 刪除的元素之后的所有元素都將向前移動以占用空白空間。 我們不會通過此操作恢復內存,因為我們沒有更改容器的容量。
其次,您可以使用標准算法std :: remove_if()和lambda來除去滿足特定條件的元素。 這是一個如何工作的小例子:
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> foo = {1,2,3,4,5,5,5,5,6,7,8,9};
std::remove_if(foo.begin(), foo.end(), [](int i){ if(i == 5) return true; else return false; });
for (const auto & e : foo)
std::cout << e << " ";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.