2015-09-28 33 views
1

如何在C++ 矢量刪除節點刪除節點此代碼甚至不編譯如何從一個向量在C++

typedef vector<simple_node> container; 
//====================================== 
// remove an item from the queue that matches what we arelady have 
container parser::removeFromQueue(container local_container, simple_node *node_to_remove) 
{ 
    for (auto i = local_container.begin(); i != local_container.end(); i++) 
    { 
     if ((i->toy == node_to_remove->toy) && 
      (i->type == node_to_remove->type)) 
      { 
       local_container.erase(remove(local_container.begin(), local_container.end(), i), local_container.end()); 
       break; 
      } 
    } 
    return local_container; 

} 

它未能就行了

local_container.erase(remove(local_container.begin(), local_container.end(), i), local_container.end()); 

編譯器抱怨查詢分配。

+1

複製整個容器到函數和背出再次將是相當低效的相比於使用通按引用(即返回'void'和接受'容器&local_container'作爲參數 –

回答

3

我覺得你這樣做是很難的。您可以使用帶有lambda表達式的標準庫中的std::remove_if來代替手寫循環遍歷容器。

container parser::removeFromQueue(container local_container, simple_node *node_to_remove) 
{ 
    auto pred = [node_to_remove](const simple_node &node) { 
     return node.toy == node_to_remove->toy && node.type == node_to_remove->type; 
    }; 
    local_container.erase(std::remove_if(local_container.begin(), local_container.end(), pred), local_container.end()); 
    return local_container; 
} 

上述功能將刪除滿足條件所有元素。如果您只想刪除第一個匹配元素,則這是一個簡單的更改。

container parser::removeFromQueue(container local_container, simple_node *node_to_remove) 
{ 
    auto pred = [node_to_remove](const simple_node &node) { 
     return node.toy == node_to_remove->toy && node.type == node_to_remove->type; 
    }; 
    auto itr = std::find_if(local_container.begin(), local_container.end(), pred); 
    if (itr != local_container.end()) { 
     local_container.erase(itr); 
    } 
    return local_container; 
}