【发布时间】:2015-10-13 16:53:23
【问题描述】:
我正在尝试编写一个算法,如果项目 ID 与参数匹配,它将搜索并从项目向量中删除项目。请参阅下面的示例代码:
struct item{
item(int newID){id = newID;}
bool operator==(const item& other){return id = other.id;}
int id
};
std::vector<std::unique_ptr<item>> vec;
vec.push_back(std::unique_ptr<item>(new item(10));
vec.push_back(std::unique_ptr<item>(new item(15));
vec.push_back(std::unique_ptr<item>(new item(20));
所以,使用上面的代码,我希望能够搜索存储值 15 的项目,并将其从向量中删除,将其删除。
我该怎么做呢?
诚然,我可能还需要复习唯一指针的使用,所以如果我的语法不正确,请随时纠正我。
我尝试过的一些解决方案如下:
void remove_item(int id){
vec.erase(
std::remove_if(
vec.begin(),
vec.end(),
[](const item& e){
return id==e.id;
}),
vec.end()
);
上面的代码产生一个错误,指出变量 id 不是 lambda 表达式的捕获列表的一部分。
其次,我试过了:
void remove_item(item e){
auto iter = std::find(vec.begin(), vec.end(), e);
vec.erase(iter);
}
本例中的上述代码在 == 运算符成员函数中产生类型不匹配错误。
【问题讨论】:
-
到目前为止你有没有尝试过?有大量关于此的信息
-
是的,我尝试过使用 remove_if lambda 表达式,这会导致编译器抱怨搜索参数不是捕获列表的一部分。我还尝试使用带有谓词函数的 std find 表达式,以及项目类上的 == 运算符。这些都不起作用
-
您应该展示这一点,以便我们为您提供帮助。仅仅问你怎么做就太宽泛了,因为有很多方法可以做到这一点。
-
向我们展示你的 lambda!请记住,
remove和remove_if实际上并没有删除任何内容。见en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom -
我将更新问题以显示我尝试的一些解决方案
标签: c++ vector smart-pointers