2016-04-06 36 views
-2

我想弄清楚如何删除矢量中的特定对象。我正在基于名为id的字符串搜索矢量。希望有人能帮助我填补空白!谢谢!是我擦除有效的方式?C++如何删除矢量中的特定对象?

我的矢量是这样的:

vector<member*> memb; 

,这是我到目前为止有:

for (int i = 0; i < memb.size(); i++) 
{ 
    if(std::find(memb.begin(),memb.end(), id) != memb.end()) { 
     myvector.erase (memb.begin(),memb.begin()=id); 
    } 
} 

回答

3

摆脱你的循环。 std::find()(和std::find_if())为您做了必要的循环。

std::find()(和std::find_if())如果找到则返回元素的迭代器,如果未找到则返回指定的last迭代器。如果找到元素,则将返回的迭代器传递给矢量的erase()方法以删除元素。

由于您在向量中存储指针,因此无法使用std::find()通过std::string值进行搜索。您需要改用std::find_if()

尝试这种情况:

struct isID 
{ 
    const std::string &m_id; 

    isID(const std::string &id) : m_id(id) {} 

    bool operator()(const member *m) const 
    { 
     return (m->id == m_id); 
    } 
}; 

std::string id = ...; 

std::vector<member*>::iterator iter = std::find_if(memb.begin(), memb.end(), isID(id)); 
if (iter != memb.end()) 
{ 
    // since you are storing pointers in the vector, you 
    // need to free the object being pointed at, if noone 
    // else owns it... 

    //delete *iter; 
    memb.erase(iter); 
} 

或者,如果使用的是C++ 11或更高:

std::string id = ...; 

auto iter = std::find_if(memb.begin(), memb.end(), 
       [id](const member* m) { return (m->id == id); }); 
if (iter != memb.end()) 
{ 
    // since you are storing pointers in the vector, you 
    // need to free the object being pointed at, if noone 
    // else owns it... 

    //delete *iter; 
    memb.erase(iter); 
} 

在后一种情况下,如果载体是旨在自己的对象,您可以存储std::unique_ptr对象的向量来自动释放member个对象为您提供:

std::vector<std::unique_ptr<member>> memb; 

... 

std::unique_ptr<member> m(new member); 
// or: std::unique_ptr<member> m = std::make_unique_ptr<member>(); 
memb.push_back(std::move(m)); 

// or: memb.push_back(std::unique_ptr<member>(new member)); 
// or: memb.push_back(std::make_unique<member>()); 
// or: memb.emplace_back(new member); 

... 

if (iter != memb.end()) 
{ 
    // std::unique_ptr will free the object automatically 
    // when the std::unique_ptr itself is destroyed... 

    memb.erase(iter); 
} 
0
vector<member *>::iterator iter; 
    for (iter=memb.begin(); iter!=memb.end();) { 
     if ((*iter)->id == id) { 
      delete (*iter); 
      iter = memb.erase(iter); 
     } else { 
      iter++; 
     } 
    } 
+3

欢迎堆栈溢出!虽然这段代码可能会回答这个问题,但提供关于* why和/或* how *这个代码如何回答这个问题的附加上下文会提高它的长期价值。 –