删除除“最大”之外的所有向量元素

时间:2012-11-07 23:20:33

标签: c++ stl vector

给出这样的矢量:

struct product {
    float price;
    float shipping;
};

vector<product> products;

除了shippingprice比例最大的产品外,如何从矢量中删除所有产品?

我尝试将迭代器保持到目前为止发现的最高值...

vector<product>::iterator it = products.begin();
vector<product>::iterator largest = products.begin();

while (it != products.end())
{
    if (it->shipping / it->price > largest->shipping / largest->price)
    {
        products.erase(largest);
        largest = it;
        ++it;
    }
    else
    {
        it = products.erase(it);
    }
}

这一切都很好,但如果向量中的第一个元素具有最高比率(它被删除),它就会失败。我可以绕过这个问题(我认为)如果largest未初始化,然后在if语句中检查,但是从我所知道的方面没有真正做到这一点的方法({{3 }})。

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

 vector<product> products;
 //populate products

 products.erase(
      products.begin(),
      std::max_element(
          product.begin(), 
          producted.end()
      )
 );
 products.resize(1u);

这假设您有一个合适的运营商&lt;对于你的类型,如果没有,做一个比较函数并将其作为max_element的第三个参数提供。

编辑:

在这种情况下,这项工作也不是显式地找到元素并删除元素的任何一方,它将排序找到1元素,然后我们可以做一次擦除。

 vector<product> products;
 //populate products
 std::nth_element(
      products.begin(), 
      products.begin()+1, 
      products.end(), 
      std::greater<product>()
 );
 products.resize(1u);

答案 1 :(得分:0)

只需重写代码即可进行一次删除

std::vector<product>::iterator largest = products.begin();

for (std::vector<product>::iterator it = products.begin(); it != products.end(); ++it)
{
    if (...) { largest = it; }
}

products.erase(it);

答案 2 :(得分:0)

您可以将largest定义为第一个元素并从第二个元素开始迭代,如下所示:

bool operator < (const struct product& p1, const struct product& p2)
{
   return p1.price/p1.shipping < p2.price/p2.shipping;
}

vector<product>::iterator largest = products.begin();
vector<product>::iterator it = products.begin();
++it;

while (it != products.end())
{
    if (*largest < *it)
    {
        products.erase(largest);
        largest = it;
        ++it;
    }
    else
    {
        it = products.erase(it);
    }
 }

但是这里有一个错误,在调用products.erase(largest)后,it将失效,所以你最好采取其他建议的方法。