将对象矢量移动到另一个向量

时间:2014-04-29 21:24:06

标签: c++ vector

我正在尝试将一个对象从向量移动到另一个对象并删除该向量。

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是临时载体。

我确定我想要做的事情需要几行内置的矢量函数,但我不确定我是如何去做的。有什么想法吗?

1 个答案:

答案 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
    }
}