提问人:Sidharth Mudgil 提问时间:7/24/2022 最后编辑:Sidharth Mudgil 更新时间:8/18/2022 访问量:389
std::sort 未正确排序向量
std::sort not sorting vector properly
问:
我想按对的第一个值和第二个值的比率对我的向量进行排序。我正在使用 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
答:
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
另一种选择是替换为 (以避免浮点运算)。/
*
评论
int
return item1.first*item2.second < item2.first*item1.second