我正在尝试将一个对象从向量移动到另一个对象并删除该向量。
std::vector <SDI::navalVessels*> SDI::fleet::remove(std::string param, std::string data)
{
vector<navalVessels*> searchFleet;
if (param == "name")
{
for (int i = 0; i<fleetList.size(); i++)
{
if(fleetList[i] -> getName() == data)
{
searchFleet[0] = std::move(fleetList[i]);
searchFleet.clear();
}
}
}
getName()是一个getter。 Fleetlist是一个对象的向量。 SeachFleet是临时载体。
我确定我想要做的事情需要几行内置的矢量函数,但我不确定我是如何去做的。有什么想法吗?
答案 0 :(得分:3)
“我无法正确地理解可能引发这样一个问题的想法混淆。”向巴贝奇先生道歉。
您有vector
个指针,因此std::move
此处没有任何可观察到的效果,并且在任何情况下都不适合您的问题。
如果我理解正确,您只想删除vector
中的某些元素。这是vector::erase
的用途:
for (int i = 0; i < fleetList.size(); ) // no increment here
{
if (fleetList[i]->getName() == data)
fleetList.erase(i);
else
i++; // only increment if the element is not erased
}
但是用这种代码搞错了太容易了;这是std::remove_if
的用途:
fleetList.erase(std::remove_if(fleetList.begin(), fleetList.end(),
[&](navalVessels* fleet){
return fleet->getName() == data;
}),
fleetList.end());
在任何情况下都不会删除指针指向的对象。如果你想要那么你应该使用智能指针(推荐)或自己手动delete
:
auto newEnd = std::partition(fleetList.begin(), fleetList.end(),
[&](navalVessels* fleet){
return fleet->getName() != data; // inverted condition
});
std::for_each(newEnd, fleetList.end(), [](navalVessels* fleet){ delete fleet; });
fleetList.erase(newEnd, fleetList.end());
或者使用原始循环:
for (int i = 0; i < fleetList.size(); ) // no increment here
{
if (fleetList[i]->getName() == data) {
delete fleetList[i];
fleetList.erase(i);
} else {
i++; // only increment if the element is not erased
}
}