Сортировка векторов строки, содержащей как числа, так и слова - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть вектор строки, содержащей числа, за которыми следуют слова:

vector<string> title
{
202 Physics
101 Math
303 Chemistry
}

Я бы хотел отсортировать их двумя способами: сначала по возрастанию (т. Е. 101 математика, 202 физика, 303 химия) ивторой по возрастанию букв / слов (т.е. 303 химия, 101 математика, 202 физика).

Решение, которое я задумал, состояло в том, чтобы использовать структуру и прочитать все записи из этого вектора строки в этот вектор структуры, а затем отсортировать их.

Однако это школьное задание, в котором меня просят работать с вектором строк.Как я могу отсортировать векторы строки двумя вышеуказанными способами?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Сортировка по первой числовой цифре, а затем по первому алфавитному символу.Не делает никаких предположений, где первая числовая цифра и первый алфавитный символ расположены в строках (если они существуют).Но предполагается, что все числа имеют одинаковое количество цифр.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{

  vector<string> vec{"202 Physics","101 Math","303 Chemistry"};

    cout << "Original\n";
    for (auto item : vec)
      std::cout << item << " ";
    cout << std::endl;


    cout << "Sort by first digit\n";
    std::sort(std::begin(vec ), std::end(vec ), [](string a, string b) 
    {return *find_if(a.begin(), a.end(), [](char c){return isdigit(c);}) 
          < *find_if(b.begin(), b.end(), [](char c){return isdigit(c);}); });
    for (auto item : vec)
      std::cout << item << " ";
    cout << std::endl;


    cout << "Sort by first alphabetical char\n";
    std::sort(std::begin(vec ), std::end(vec ), [](string a, string b) 
    {return *find_if(a.begin(), a.end(), [](char c){return isalpha(c);}) 
          < *find_if(b.begin(), b.end(), [](char c){return isalpha(c);}); });
    for (auto item : vec)
      std::cout << item << " ";
    cout << std::endl;    
}

Выводит:

Original
202 Physics 101 Math 303 Chemistry 
Sort by first digit
101 Math 202 Physics 303 Chemistry 
Sort by first alphabetical char
303 Chemistry 101 Math 202 Physics 
0 голосов
/ 22 февраля 2019

std::sort позволяет дополнительный компаратор .Простая лямбда-функция позволяет выполнять базовые манипуляции для сравнения на основе различных компонентов строки.Вот очень простой минимальный пример, который предполагает, что номера курсов всегда имеют длину в три цифры, после которых следует пробел, поэтому вы можете просто использовать std::stoi для числового сравнения и метод substr для сравнения названий курсов:

int main()
{
    std::vector<std::string> title{"202 Physics"s, "101 Math"s, "303 Chemistry"s};

    std::sort(title.begin(), title.end(), [](const auto& a, const auto &b) { return std::stoi(a) < std::stoi(b); });

    std::cout << "By number" << std::endl;
    for (auto&& s : title) {
        std::cout << s << std::endl;
    }


    std::sort(title.begin(), title.end(), [](const auto& a, const auto &b) { return a.substr(4) < b.substr(4); });
    std::cout << std::endl << "By title" << std::endl;
    for (auto&& s : title) {
        std::cout << s << std::endl;
    }
    return 0;
}

Попробуйте онлайн!

В каждом случае компаратор возвращает true, когда левый элемент меньше правого, поэтому [](const auto& a, const auto& b) { return std::stoi(a) < std::stoi(b); }) преобразует обе строкина int (std::stoi останавливает обработку при попадании в нецифровый символ пробела после номера курса) и сравнение, в то время как [](const auto& a, const auto &b) { return a.substr(4) < b.substr(4); } обрезает первые четыре символа каждой строки, оставляя только заголовки курса и сравниваяостаток.

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