给出这样的矢量:
struct product {
float price;
float shipping;
};
vector<product> products;
除了shipping
到price
比例最大的产品外,如何从矢量中删除所有产品?
我尝试将迭代器保持到目前为止发现的最高值...
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 }})。
有什么建议吗?
答案 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
将失效,所以你最好采取其他建议的方法。