2015-05-10 29 views
2

以下是類和容器如何使用stl從容器集中刪除自定義對象?

class student { 
    std::string name; 
    int id; 
} 

set<Student*, compare> s; // sorted by id that i have done correctly 
class compare { 
public: 
    bool operator()(Student* s1, Student* s2) { 
     return s1->id < s2->id; 
    } 
}; 

如何從組具有一些名稱=「蘇瑞」刪除一個對象;

我做了什麼?

std::remove(s.begin(), s.end(), nameIs("suri")); 

仿函數是

struct nameIs { 
    nameIs (std::string s) : toFind(s) { } 
    bool operator() (Student* st) 
    { return st->name.compare(toFind) == 0; } 
    std::string toFind; 
}; 

但我收到編譯時錯誤 錯誤2錯誤C3892: '_next':你不能分配給一個變量,常量C:\ Program Files文件(86) \ microsoft visual studio 10.0 \ vc \ include \ algorithm 1816

我在做什麼錯? 如何使用stl從容器集中刪除自定義對象?

+0

我已經添加了比較也 – Suri

回答

3

enter image description here

如果u看它,*first == val但實際上在烏拉圭回合的情況下,它shud是*first->name == val

很好,U可以試試這個

std::set<Student*>::iterator it = s.begin(); 
for (it = s.begin(); it != s.end();) { 
    if ((*it)->name == "suri") { 
     s.erase(it++); 
     break; 
    } 
    else { 
     ++it; 
    } 
} 
+0

我不能使用任何stl函數像remove? – Suri

0

這樣的算法一直proposed並添加到Library Fundamentals 2 TS。如果您的編譯器支持庫基礎2 TS,則可以使用#include<experimental/set>並使用std::experimetal::erase_if(s, nameIs("suri"))

1

正如@pola sai ram所指出的那樣,您不能起訴std::remove,因爲這要求elemetns是可分配的。

但是,你不需要刪除
std::remove並沒有真正從容器中取出的元素,但只複製你想要保留前所有elments(見erase-remove-idiom)。對於實際的移除,無論如何,您總是必須使用容器專用的erase函數。所以在你的情況下,你可以使用find_if作爲remove的替代品。缺點是你必須多次調用它:

auto it = std::find_if(begin(s), end(s), nameIs("suri")); 
while (it != end(s)){ 
    it = s.erase(it); 
    it = std::find_if(it, end(s), nameIs("suri")); 
} 
相關問題