Russian Qt Forum
Февраля 19, 2025, 01:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Задачка сортировки  (Прочитано 7426 раз)
vbi
Гость
« : Апреля 23, 2013, 21:14 »

Есть массив string типа:

1004-34
1003-11
1006-31
1005-78
1002-25

Как отсортировать этот массив по значению после дефиса?
То есть чтоб было:

1003-11
1002-25
1006-31
1004-34
1005-78


Записан
VPS
Гость
« Ответ #1 : Апреля 23, 2013, 21:28 »

А что, если использовать std::sort со своей функцией сравнения?
Записан
vbi
Гость
« Ответ #2 : Апреля 23, 2013, 21:56 »

std::sort то что надо, только какую написать функцию сравнения? Вроде должно быть просто, задачка олимпиадная.
Неужели только искать номер вхождения дефиса, обрезать после дефиса конвертировать в число и сравнивать?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Апреля 23, 2013, 22:49 »

Код:
int getValue(QString text)
{
    return text.remove(QRegExp("[0-9]*-")).toInt();
}

void qSort(QStringList *list, int minIndex, int maxIndex)
{
    int i = minIndex;
    int j = maxIndex;

    // x - опорный элемент посредине между low и high
    int x = getValue(list->at((minIndex + maxIndex) / 2));
    do
    {
        while(getValue(list->at(i)) < x)
            ++i;  // поиск элемента для переноса в старшую часть

        while(getValue(list->at(j)) > x)
            --j;  // поиск элемента для переноса в младшую часть

        if(i <= j)
        {
            // обмен элементов местами:
            list->swap(i, j);
            // переход к следующим элементам:
            i++;
            j--;
        }

    }while(i < j);

    if(minIndex < j)
        qSort(list, minIndex, j);

    if(i < maxIndex)
        qSort(list, i, maxIndex);
}

void qSort(QStringList *list)
{
    qSort(list, 0, list->count() - 1);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QStringList list;
    list << "1004-34"
         << "1003-11"
         << "1006-31"
         << "1005-78"
         << "1002-25";

    qDebug() << list;

    qSort(&list);

    qDebug() << list;

    return a.exec();
}


Запускается C:\Sort\untitled-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_______\release\untitled.exe...
("1004-34", "1003-11", "1006-31", "1005-78", "1002-25")
("1003-11", "1002-25", "1006-31", "1004-34", "1005-78")
Записан

m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #4 : Апреля 24, 2013, 00:18 »

Я бы так сделал:

Код
C++ (Qt)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
int toint(const std::string & x) {
   auto begin = x.find_first_of("-", 0);
   auto end = x.find_first_not_of("0123456789", ++begin);
   return std::stoi(x.substr(begin, end-begin));
}
 
 
int main()
{
   std::vector<std::string> stringlist = {
       "1004-34",
       "1003-11",
       "1006-31",
       "1005-78",
       "1002-25"
   };
 
   std::cout << "Before sorting:" << std::endl;
   for (auto & s : stringlist) { std:: cout << s << std::endl; }
 
 
   std::sort(stringlist.begin(), stringlist.end(),
             [](const std::string &s1, const std::string &s2) { return toint(s1) < toint(s2); });
 
   std::cout << "After sorting:" << std::endl;
   for (auto & s : stringlist) { std:: cout << s << std::endl; }
 
   return 0;
}
 
 
« Последнее редактирование: Апреля 24, 2013, 13:45 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Апреля 24, 2013, 00:19 »

Блин, незаметил что тут без qt хотят решение Улыбающийся

Тогда вот:
Код:
int getValue(string text)
{
    string temp;

    bool flag = false;

    for(int i = 0; i < text.size(); i++)
    {
        if(flag)
            temp.append(&text[i]);

        if(text[i] == '-')
            flag = true;
    }

    return atoi(temp.c_str());
}

void qSort(vector <string> *vect, int minIndex, int maxIndex)
{
    int i = minIndex;
    int j = maxIndex;

    // x - опорный элемент посредине между low и high
    int x = getValue(vect->at( (minIndex + maxIndex) / 2) );
    do
    {
        while(getValue(vect->at(i)) < x)
            ++i;  // поиск элемента для переноса в старшую часть

        while(getValue(vect->at(j)) > x)
            --j;  // поиск элемента для переноса в младшую часть

        if(i <= j)
        {
            // обмен элементов местами
            swap(vect->at(i), vect->at(j));

            // переход к следующим элементам:
            i++;
            j--;
        }

    }while(i < j);

    if(minIndex < j)
        qSort(vect, minIndex, j);

    if(i < maxIndex)
        qSort(vect, i, maxIndex);
}

void qSort(vector <string> *vect)
{
    qSort(vect, 0, vect->size() - 1);
}

int main(int argc, char *argv[])
{
    vector <string> stringVector;
    stringVector.push_back("1004-34");
    stringVector.push_back("1003-11");
    stringVector.push_back("1006-31");
    stringVector.push_back("1005-78");
    stringVector.push_back("1002-25");

    for(int i = 0; i < stringVector.size(); i++)
        cout << stringVector[i].c_str() << "\n";

    qSort(&stringVector);

    cout << "\n";

    for(int i = 0; i < stringVector.size(); i++)
        cout << stringVector[i].c_str() << "\n";

    return 0;
}


Запускается C:\Sort\untitled-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK_______\release\untitled.exe...
1004-34
1003-11
1006-31
1005-78
1002-25

1003-11
1002-25
1006-31
1004-34
1005-78


Библиотеки с++ такие тяжелые для понимания, особенно после Qt... Улыбающийся
Qtшный вариант сделал меньше чем за 10 минут
А на чистом с++ пока гуглил стандартные библиотеки и их классы, пока вспоминал, и делал потратил 1 час Злой
Записан

m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Апреля 24, 2013, 00:30 »


Библиотеки с++ такие тяжелые для понимания, особенно после Qt... Улыбающийся
Qtшный вариант сделал меньше чем за 10 минут
А на чистом с++ пока гуглил стандартные библиотеки и их классы, пока вспоминал, и делал потратил 1 час Злой

Чёт всё равно, как то сложно получилось..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Апреля 24, 2013, 04:26 »


Библиотеки с++ такие тяжелые для понимания, особенно после Qt... Улыбающийся
Qtшный вариант сделал меньше чем за 10 минут
А на чистом с++ пока гуглил стандартные библиотеки и их классы, пока вспоминал, и делал потратил 1 час Злой

Чёт всё равно, как то сложно получилось..

Давно на чистом с++ не писал Улыбающийся
Записан

m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Апреля 24, 2013, 11:37 »


Библиотеки с++ такие тяжелые для понимания, особенно после Qt... Улыбающийся
Qtшный вариант сделал меньше чем за 10 минут
А на чистом с++ пока гуглил стандартные библиотеки и их классы, пока вспоминал, и делал потратил 1 час Злой

Чёт всё равно, как то сложно получилось..

Давно на чистом с++ не писал Улыбающийся

Т.е. когда вы пишите что-либо с использованием Qt, это уже получается не чистый c++?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Bepec
Гость
« Ответ #9 : Апреля 24, 2013, 12:03 »

Да как ни странно Улыбающийся Qt это ж обёртка по сути. Так что по сути правильно говорить, что это не чистый С++. а нарядный С++ Веселый
Записан
vbi
Гость
« Ответ #10 : Апреля 24, 2013, 14:29 »

Пасиба всем! Вот и я на чистом давно не писал))
Записан
vbi
Гость
« Ответ #11 : Апреля 24, 2013, 22:37 »

gil9red, спасибо, работает.
m_ax, что такое "auto", впервые такое вижу? Не компилит его.
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #12 : Апреля 24, 2013, 23:46 »

что такое "auto", впервые такое вижу? Не компилит его.
http://en.cppreference.com/w/cpp/language/auto
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Апреля 25, 2013, 06:22 »

Возможно здесь имелось ввиду совсем другое - ограниченный (и заранее известный) диапазон чисел после знака минус. Тогда можно обойтись без сортировки
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #14 : Апреля 25, 2013, 09:50 »

gil9red, спасибо, работает.
m_ax, что такое "auto", впервые такое вижу? Не компилит его.

Тогда вообще странно, что вас только auto удивило..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.091 секунд. Запросов: 23.