C++ 如何使用stl从容器集中删除自定义对象?

C++ 如何使用stl从容器集中删除自定义对象?,c++,stl,set,remove-if,C++,Stl,Set,Remove If,下面是类和容器 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;

下面是类和容器

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;
    }
};
函子是

struct nameIs {
    nameIs ( std::string s ) : toFind(s) { }
    bool operator() ( Student* st)
    { return st->name.compare(toFind) == 0; }
    std::string toFind;
};
但是我得到了编译时错误 错误2错误C3892:“\u下一步”:无法分配给常量c:\program files(x86)\microsoft visual studio 10.0\vc\include\algorithm 1816”的变量

我做错了什么? 如何使用stl从容器集中删除自定义对象?

如果你看它,
*first==val
,但实际上在你的情况下,它应该是
*first->name==val

嗯,你可以试试这个

std::set<Student*>::iterator it = s.begin();
for (it = s.begin(); it != s.end(); ) {
     if ((*it)->name == "suri") {
        s.erase(it++);
         break;
    }
    else {
        ++it;
    }
}
std::set::iterator it=s.begin();
for(it=s.begin();it!=s.end();){
如果((*it)->name==“suri”){
s、 擦除(it++);
打破
}
否则{
++它;
}
}

这样的算法已经被添加到。如果您的编译器支持Library Fundamentals 2 TS,您可以
#包括
并使用
std::experimental::erase\u如果(s,nameIs(“suri”)
如@pola sai ram所指出的,您不能起诉
std::remove
,因为这要求元素是可分配的

但是,您不需要删除:
std::remove
不会真正从容器中删除元素,但只会将要保留的所有元素复制到前面(请参阅)。对于实际删除,无论如何都必须使用特定于容器的
擦除
功能。因此,在您的情况下,您可以使用
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"));
}

我还添加了比较功能,我不能使用任何stl函数,比如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"));
}