Как отсортировать вектор пар <float, string> независимо от строки - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь отсортировать 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 голосов
/ 31 августа 2018

Вы можете предоставить функцию сравнения для 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;
}

Демонстрация в реальном времени

0 голосов
/ 31 августа 2018

std::pair имеет перегруженные операторы сравнения ( См. Ссылку )

По умолчанию operator < для std::pair сравнивает первые элементы, если они равны, то вторые элементы.

Вы должны предоставить свой собственный предикат и использовать std::stable_sort, чтобы сохранить порядок элементов, если первые элементы в паре равны.

std::stable_sort(vec.begin(), vec.end(),
                 [](const auto& a, const auto& b){return a.first < b.first;});
0 голосов
/ 31 августа 2018

Вы, вероятно, ищете std::stable_sort. Сортирует элементы, сохраняя порядок эквивалентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...