如果设置了 bool 标志,则使 std::max_element 跳过元素

问题描述 投票:0回答:1

我有一个项目向量和一个布尔标志:

std::vector<std::pair<Item, bool>> items;

我正在每次迭代时对该向量中的所有最佳项目进行贪婪(并且效率低下,我知道这一点并且这是故意的)搜索。每次迭代后,我通过将布尔标志设置为 false 来使当前最佳项目无效。因此,在下一次迭代中,将不再考虑该项目,至少这是我正在尝试做的。我想继续下去,直到所有元素都为假。我通过 Item 类提供的 GetYield 函数获得了最佳价值:

while( std::any_of( items.begin(), items.end(),
    []( const auto& item ) { return item.second; } ) )
{
    auto max_element = std::max_element( items.begin(), items.end(),
        [&]( auto& itema, auto& itemb )
        {
                return  itema.second && itemb.second && ( itema.first.GetYield() < itemb.first.GetYield() );
        } );

    max_element->second = false;
}

一旦第一个元素设置为 false,此代码就会挂起,它会一遍又一遍地返回相同的元素。我怎样才能解决这个问题而不需要从向量中删除元素(这就是我与布尔值配对的全部原因)?

c++ stl c++17
1个回答
0
投票
应该

比较向量中的两个元素,如果第一个元素“小于”第二个元素,则返回false

这里有四种情况:

如果两项均为空,则比较应返回
    false
  • 如果 
  • itemA.second
  • 为 false,则比较应返回
    true
    。(“空”小于任何值)
    如果 
  • itemB.second
  • 为 false,则比较应返回
    false
    。 (“有”总是大于“空”)
    如果都不为空,那么你可以比较
  • GetYield()
  • 
    
  • 对于这四种情况,您的比较函数返回
false

false
false
GetYield()
    

© www.soinside.com 2019 - 2024. All rights reserved.