如何使用 stl remove 从容器集中删除自定义对象?
How to remove a customized object using stl remove from container set?
以下是class和容器
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;
}
};
如何从集合中删除具有某个名称的对象 = "suri";
我做了什么?
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 error C3892: '_Next' : 你不能分配给常量变量 c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm 1816
我做错了什么?
如何使用 stl remove 从容器集中删除自定义对象?
如果你看它,*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;
}
}
这样的算法已经proposed and added to Library Fundamentals 2 TS。如果您的编译器支持 Library Fundamentals 2 TS,您可以 #include
<experimental/set>
并使用 std::experimetal::erase_if(s, nameIs("suri"))
.
正如@pola sai ram 指出的那样,您不能起诉 std::remove
因为这要求元素是可分配的。
但是,您不需要删除:
std::remove
并没有真正从您的容器中删除元素,而只是将您想要保留的所有元素复制到前面(参见 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"));
}
以下是class和容器
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;
}
};
如何从集合中删除具有某个名称的对象 = "suri";
我做了什么?
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 error C3892: '_Next' : 你不能分配给常量变量 c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm 1816
我做错了什么? 如何使用 stl remove 从容器集中删除自定义对象?
如果你看它,*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;
}
}
这样的算法已经proposed and added to Library Fundamentals 2 TS。如果您的编译器支持 Library Fundamentals 2 TS,您可以 #include
<experimental/set>
并使用 std::experimetal::erase_if(s, nameIs("suri"))
.
正如@pola sai ram 指出的那样,您不能起诉 std::remove
因为这要求元素是可分配的。
但是,您不需要删除:
std::remove
并没有真正从您的容器中删除元素,而只是将您想要保留的所有元素复制到前面(参见 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"));
}