2010-04-30 65 views
2

我有一個vec_A存儲的class A實例爲:vec_A.push_back(A());使用擦除刪除std向量的元素對象:a)內存處理和b)更好的方法?

我想在後面階段移除的矢量一些元素,有兩個問題:a)元素也將被刪除:vec_A.erase(iterator)有任何額外的代碼我需要添加以確保沒有內存泄漏? 。

b)假設條件if(num <5)是如果num在特定numberList中。鑑於此,是否有更好的方法來刪除矢量的元素比我在下面說明的要少?

#include<vector> 
#include<stdio.h> 
#include<iostream> 

class A { 
     public: 

      int getNumber();    
      A(int val); 
      ~A(){}; 
     private: 
       int num; 
}; 

A::A(int val){ 
     num = val; 
     }; 

int A::getNumber(){ 
    return num; 
}; 

int main(){ 


    int i =0; 
    int num; 
    std::vector<A> vec_A; 
    std::vector<A>::iterator iter; 

      for (i = 0; i < 10; i++){ 
       vec_A.push_back(A(i)); 
      } 
      iter = vec_A.begin(); 

      while(iter != vec_A.end()){ 
       std::cout << "\n --------------------------"; 
       std::cout << "\n Size before erase =" << vec_A.size(); 
       num = iter->getNumber() ; 
       std::cout << "\n num = "<<num; 
       if (num < 5){ 
         vec_A.erase(iter); 
         } 
       else{ 
        iter++; 
        } 

       std::cout << "\n size after erase =" << vec_A.size(); 
      }   


    std::cout << "\nPress RETURN to continue..."; 
    std::cin.get(); 

    return 0; 
} 

回答

4

一)元素也將被刪除: vec_A.erase(迭代器)是否有任何 額外的代碼,我需要添加到使 確保不存在內存泄漏? 。

是的,這就是你需要做的。不會有內存泄漏。既然你沒有在堆上分配你的對象,當你做了vec_A.push_back(A())一個新的對象複製到載體中。當你擦除時,向量將負責刪除元素。

假設條件if(num < 5)是if num是特定numberList中的一個。 鑑於此,有沒有更好的方法來 刪除一個向量的元素比 我在下面說明什麼?

是的,你可以remove/erase成語。這是一個例子:

class A 
{ 
public: 
    A(int n) : m_n(n) 
    { 
    } 

    int get() const 
    { 
     return m_n; 
    } 
private: 
    int m_n; 
}; 

bool lessThan9(const A& a) 
{ 
    return a.get() < 9; 
} 

//Or if you want for a generic number 
struct Remover : public std::binary_function<A,int,bool> 
{ 
public: 
    bool operator()(const A& a, int n)const 
    { 
     return a.get() < n; 
    } 
}; 

int main() 
{ 
    std::vector<A> a; 
    a.push_back(A(10)); 
    a.push_back(A(8)); 
    a.push_back(A(11)); 
    a.push_back(A(3)); 

    a.erase(std::remove_if(a.begin(), a.end(), lessThan9), a.end()); 

    //Using the user-defined functor 
    a.erase(std::remove_if(a.begin(), a.end(), std::bind2nd(Remover(), 9)), a.end()); 

    return 0; 
} 
+1

爲什麼不'a.erase(標準::的remove_if(a.begin(),a.end() ,lessThan9),a.end());' – 2010-04-30 09:33:44

+0

謝謝納文!這非常有用。 。另外,感謝Andreas的額外評論,我認爲Naveen已經更新了他的代碼 – memC 2010-04-30 09:55:29

1

1)資源處理由類本身完成。類的析構函數負責確保沒有內存泄漏。

2)從向量中刪除元素最好做回至前:

for (std::vector<A>::reverse_iterator it = vec_A.rend(); it != vec_A.rbegin(); --it) 
{ 
    if (it->getNumber() < 5) {vec_A.erase(it.base());} 
} 
+0

這個(從後面到前面的earasing)很有用,但我並不總是有條件if(num <5)。 – memC 2010-04-30 09:56:45

+0

我不明白爲什麼你認爲消除後端到前端顯着更好。最好使用「刪除 - 刪除」成語(這會使整個操作*單遍*)完成。 – UncleBens 2010-04-30 09:57:46

+0

刪除 - 刪除成語的缺點是需要一個謂詞。我不喜歡爲了一次擦除而編寫少於5的函數。話雖如此,如果謂詞已經存在或可以重用(或者如果我有lambda表達式),remove-erase就是我的選擇。 – 2010-04-30 10:28:45

相關問題