C++ 删除除';最大的';一

C++ 删除除';最大的';一,c++,stl,vector,C++,Stl,Vector,给定这样一个向量: struct product { float price; float shipping; }; vector<product> products; 这一切都很好,但是如果向量中的第一个元素具有最高的比率(它被删除),那么它就失败了。如果最大的未初始化,然后在if语句中检查它,我可以绕过这个问题(我认为),但从我所知道的()来看,没有真正的方法来解决这个问题 有什么建议吗?矢量产品; vector<product> product

给定这样一个向量:

struct product {
    float price;
    float shipping;
};

vector<product> products;
这一切都很好,但是如果向量中的第一个元素具有最高的比率(它被删除),那么它就失败了。如果
最大的
未初始化,然后在
if
语句中检查它,我可以绕过这个问题(我认为),但从我所知道的()来看,没有真正的方法来解决这个问题

有什么建议吗?

矢量产品;
 vector<product> products;
 //populate products

 products.erase(
      products.begin(),
      std::max_element(
          product.begin(), 
          producted.end()
      )
 );
 products.resize(1u);
//填充产品 产品。擦除( products.begin(), std::max_元素( product.begin(), producted.end() ) ); 产品。调整大小(1u);
这假设您的类型有一个合适的运算符<,如果没有,则创建一个比较函数,并将其作为max_元素的第三个参数提供

编辑:

这项工作也是,在这种情况下,不是显式地找到元素并删除元素的任一侧,而是排序找到1个元素,然后我们可以执行一次擦除

 vector<product> products;
 //populate products
 std::nth_element(
      products.begin(), 
      products.begin()+1, 
      products.end(), 
      std::greater<product>()
 );
 products.resize(1u);
向量积;
//填充产品
std::n_元素(
products.begin(),
products.begin()+1,
产品。结束(),
std::greater()
);
产品。调整大小(1u);

只需重写代码,只进行一次删除:

std::vector::iterator=products.begin();
对于(std::vector::iterator it=products.begin();it!=products.end();++it)
{
如果(…){max=it;}
}
产品。擦除(it);

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

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);
    }
 }
bool运算符<(常量结构产品和p1、常量结构产品和p2)
{
返回p1.price/p1.shipping

但是在
产品之后,这里有一个bug。调用erase(最大)
它将无效,因此您最好采用这里建议的其他方法。

向量有多大?只需将
初始化为
产品。begin()+1
。不要太大。。。最多10个您不需要第二次调用
max_元素
;在第一次
擦除之后
最大值是第一个元素。所以
products.erase(++products.begin(),products.end())
就可以了。我想我应该使用
std::swap
将最大元素移动到集合的开头,然后删除其余元素(可能会更快,尤其是对于
vector
),这就是为什么我问vector有多大:d
products.assign(1,*std::max_元素(product.begin(),producted.end())
@MooingDuck,不错,但是你对
产品使用了三个不同的名称。假设我的向量有10个元素。一次删除如何删除其中9个元素(应该只剩下一个比率最大的元素)?@zoran119:您需要两次通过。首先确定最大比率的值,然后删除所有这些元素。使用
std::remove_if
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);
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);
    }
 }