Russian Qt Forum
Ноябрь 23, 2024, 08:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Задачка сортировки  (Прочитано 7272 раз)
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.087 секунд. Запросов: 22.