2016-04-06 37 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 *這個代碼如何回答這個問題的附加上下文會提高它的長期價值。 –