2

以下是类和容器

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;
};

但我收到编译时错误 Error 2 error C3892: '_Next' : you cannot assign to a variable that is const c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm 1816

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

4

3 回答 3

3

在此处输入图像描述

如果你看它,*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;
    }
}
于 2015-05-10T06:28:31.243 回答
1

正如@pola sai ram 指出的那样,您不能起诉std::remove,因为这要求元素是可分配的。

但是,您不需要 remove
std::remove并不会真正从容器中删除元素,而只会将您想要保留的所有元素复制到前面(请参阅erase-remove-idiom)。erase对于实际的删除,无论如何您总是必须使用容器特定的功能。因此,在您的情况下,您可以仅用find_ifremove. 缺点是您必须多次调用它:

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"));
}
于 2015-05-10T09:48:18.020 回答
0

这种算法已被提出并添加到Library Fundamentals 2 TS中。如果您的编译器支持 Library Fundamentals 2 TS,您可以#include <experimental/set>使用std::experimetal::erase_if(s, nameIs("suri")).

于 2015-05-10T08:52:56.590 回答