使用索引

时间:2018-05-02 05:32:01

标签: c++ vector

我有一个带有getType的私有成员类的类,在第二个类中我有一个这样的类的向量,我可以添加到我想要的多个类,现在我想要做的就是如果我给了一个“类型”我想通过使用该字符串找到该对象并删除它来从这样的向量中删除整个对象。我尝试过以下方式,但没有工作,也试过迭代器和模板,但似乎没有工作。 *为了它而简化了这个*

class AutoMobile{
    private:
      string type;
    public:
        AutoMobile(string type){
            this->type = type;
        }
        string getType(){return type;}
};


class Inventory{
    private:
        vector<AutoMobile> cars;
    public:
        void removeFromInventory(string type){    // No two cars will have the same milage, type and ext
            AutoMobile car("Ford");
            cars.push_back(car);
            for( AutoMobile x : cars){
                cout<<x.getType();
            }
            for( AutoMobile x : cars){
                if(x.getType() == "Ford"){
                    cars.erase(*x); // Problem i here, this does not work!
                 }
            }
        }
};

int main(void) {
    Inventory Inven;
    Inven.removeFromInventory("Ford");
   return 0;
}

2 个答案:

答案 0 :(得分:1)

您可以使用remove_if

cars.erase(std::remove_if(cars.begin(), 
                          cars.end(),
                          [=](AutoMobile &x){return x.getType()==type;}),
           cars.end());

答案 1 :(得分:1)

当您打算从for中删除项目时,使用范围std::vector循环是不合适的。改为使用迭代器。

vector<AutoMobile>::iterator iter = cars.begin();
for ( ; iter != cars.end(); /* Don't increment the iterator here */ )
{
   if ( iter->getType() == "Ford" )
   {
      iter = cars.erase(iter);
      // Don't increment the iterator.
   }
   else
   {
      // Increment the iterator.
      ++iter;
   }
}

您可以使用标准库函数和lambda函数来简化该代码块。

cars.erase(std::remove_if(cars.begin(),
                          cars.end(),
                          [](AutoMobile const& c){return c.getType() == 
"Ford";}),
                          cars.end());