如何对向量<float,string =“”>进行排序,而不考虑字符串

时间:2018-08-31 08:15:08

标签: c++ sorting

我正在尝试按升序对std::vector<std::pair<float, std::string>>进行排序。

尽管使用std::sort可行,但我发现如果浮点数具有相同的值,则字符串会影响顺序。

我想对向量进行排序,而不管字符串如何,因此前一个元素始终位于第一个元素之后。

我的代码:

#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::pair<float, std::string>> vec;
    vec = {{1, "e"}, {1, "d"}, {1, "c"}, {1, "b"}, {1, "a"}};
    std::sort(vec.begin(), vec.end());
    for (auto i : vec)
        std::cout << i.first << ", " << i.second << '\n';
}

我得到的结果:(价值联系时的字母顺序)

1, a
1, b
1, c
1, d
1, e
Program ended with exit code: 0

我想要的结果:(价值联系在一起时,前者优先)

1, e
1, d
1, c
1, b
1, a
Program ended with exit code: 0

3 个答案:

答案 0 :(得分:11)

std::pair是否正在比较重载(See the reference)的运算符

默认情况下,operator <的{​​{1}}比较第一个元素(如果相等),然后比较第二个元素。

如果成对的第一个元素相等,则应提供自己的谓词并使用std::pair来保留元素的顺序。

std::stable_sort

答案 1 :(得分:0)

您可能正在搜索std::stable_sort。在对元素进行排序的同时保留等价顺序。

答案 2 :(得分:-1)

您可以为std::sort提供比较功能。像

std::sort(vec.begin(), vec.end(), comp);

在您的情况下,比较功能可以是:

bool comp(const std::pair<float, std::string>&a, const std::pair<float, std::string>&b){
    if(a.first == b.first) return 0;
    else return a.first < b.first;
}

Live Demo