std::sort 未正确排序向量

std::sort not sorting vector properly

提问人:Sidharth Mudgil 提问时间:7/24/2022 最后编辑:Sidharth Mudgil 更新时间:8/18/2022 访问量:389

问:

我想按对的第一个值和第二个值的比率对我的向量进行排序。我正在使用 C++ STL 函数,但我不知道,它没有正确排序向量,这是我的代码:sort

比较仪

bool comparator(const std::pair<int, int> &item1, const std::pair<int, int> &item2)
{
    return (item1.first / item1.second) < (item2.first / item2.second);
}

排序函数调用

int main()
{
    std::vector<std::pair<int, int>> items = {{4, 5}, {1, 4}, {3, 5}, {6, 7}, {8, 8}};
    std::sort(items.begin(), items.end(), comparator);
    for (auto item : items)
        std::cout << item.first << ", " << item.second << "\n";
    
    return 0;
}

我的输出

8, 8
4, 5
1, 4
3, 5
6, 7

预期输出

8, 8
6, 7
4, 5
3, 5
1, 4

我也试过了

return (double)(item1.first / item1.second) > (double)(item2.first / item2.second);

但它也给了我另一个输出

4, 5
1, 4
3, 5
6, 7
8, 8
C++ 排序 STL 比较 stdvector

评论

2赞 Peter 7/24/2022
您的比较器正在进行整数除法,这会产生一个四舍五入为零的分数。这可能解释了你的担忧。(也有可能 - 尽管我没有检查过 - 它不符合比较器定义严格弱排序的强制性要求 - 这会导致未定义的行为)。无论如何,为了避免整数除法的问题,请尝试在数学上是等价的,除了整数除法的影响(尽管根据提供的值,存在整数溢出的可能性)intreturn item1.first*item2.second < item2.first*item1.second

答:

1赞 Vlad from Moscow 7/24/2022 #1

您似乎想比较浮点结果,例如

 return (static_cast<double>( item1.first ) / item1.second) < 
        (static_cast<double>( item2.first ) / item2.second);

在这种情况下,向量将按升序排序,结果将是

1, 4
3, 5
4, 5
6, 7
8, 8

如果要按降序对向量进行排序,请使用此 return 语句

return (static_cast<double>( item2.first ) / item2.second) < 
        (static_cast<double>( item1.first ) / item1.second);

在这种情况下,输出将是

8, 8
6, 7
4, 5
3, 5
1, 4

至于这个返回语句

return (double)(item1.first / item1.second) > (double)(item2.first / item2.second);

然后在括号中使用整数算术

(item1.first / item1.second)

因此,投射到双倍对比较没有影响。

评论

0赞 Sidharth Mudgil 7/24/2022
我有一个问题,我尝试了'return (double)(item1.first / item1.second) < (double)(item2.first / item2.second);',但为什么它不起作用?另外,为什么它没有类型转换?
0赞 Vlad from Moscow 7/24/2022
@SidharthMudgil 它不起作用,因为在括号(item1.first / item1.second)中使用了整数算术。
0赞 HolyBlackCat 7/24/2022
另一种选择是替换为 (以避免浮点运算)。/*