簡體   English   中英

如何刪除向量中的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM