2010-04-30 58 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

相关问题