Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
tatsu
0 / 0 / 0
Регистрация: 29.04.2009
Сообщений: 3
#1

(STL LIST SORT) Сортировка по некольким критериям - C++

19.07.2009, 01:48. Просмотров 2288. Ответов 1
Метки нет (Все метки)

Здравствуйте!
Столкнулся с такой проблемой при сортировке списка.

Есть структура:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct PackObject
{
    bool            Placed;         // Помещен ли на карту текстур
    string          SceneAlias;     // Имя сцены
 
    string          TexFile;
    int             TexWidth;
    int             TexHeight;
    bool            TexMipMap;
    bool            TexGray;
    bool            TexJpeg;
 
    string          ObjAlias;          // Имя родительского объекта
    TRect           ObjRect;
    int             AniFrameNumber;    // Порядковый номер кадра
    int             AniFrames;
    int             AniFramesPerLine;
};
А также контейнер list, элемент которого задан соответсвующей структурой.
C++
1
2
typedef list<PackObject>               PackObjectsArray;
typedef list<PackObject>::iterator     PackObjectsIterator;
Требуется отсортировать данный контейнер наполненый некой информацией по
1) Имени сцены "SceneAlias"
2) Аттрибутам текстуры TexMipMap;TexGray;TexJpeg;
3) По размерам текстуры TexWidth; TexHeight;

ЭТО НЕ ОЗНАЧЕТ СДЕЛАТЬ 3 РАЗНЫХ СОРТИРОВКИ!!! ЭТО ЗНАЧИТ ЧТОБЫ СВЕРХУ ВНИХ ОБЪЕКТЫ БЫЛИ ОТСОРТИРОВАННЫ ПО ДАННЫМ КРИТЕРИЯМ!

Т.е.
1) Scene1 JPEG MIPMAP GRAY 1000x900
2) Scene1 JPEG MIPMAP GRAY 800x900
3) Scene1 JPEG MIPMAP 1000x900
4) Scene1 JPEG MIPMAP 700x700
5) Scene1 JPEG GRAY 1500x1500
6) Scene1 JPEG GRAY 700x700
7) Scene1 JPEG 2000x700
8) Scene1 JPEG 1000x700
8) Scene1 100x100
9) Scene1 100x50
10) Scene2 .......

Т.е. номера пунктов 3-ех аттрибутов являются как бы приоритетами (важностью) 1) 2) 3)


НО ПРОБЛЕМА НЕ В ТОМ КАК ОТСОРТИРОВАТЬ!!!!!!

Проблема заключается в том что функция PREDICATE для списка LIST отказывается сортировать корректно его элементы!

Вот один из испробованных мною вариантов PREDICATE функции (до этого я пытался делать эту функцию разными способами в том числе перегрузкой скобок () и перегрузкой знака ">" )

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
bool PackPred(PackObject &obj1, PackObject &obj2)
{
    bool result = false;
 
    if (sortmem_apartscenes)
    {
        // Cортируем по имени сцены в алфавитном порядке
        string str1 = obj1.SceneAlias;
        string str2 = obj2.SceneAlias;
        size_t minlen = (str1.length() > str2.length()) ? str2.length() : str1.length();
        for (size_t i = 0; i < minlen; i++)
        {
            if (str1[i] > str2[i])
            {
                result = true;
                break;
            }
        }
        if (str1.length() > str2.length()) result = true;
    }
 
    // Объекты одной сцены сортируем по параметрам текстуры
    if (sortmem_apartjpeg)
    {
        if ((obj1.TexJpeg) && (!obj2.TexJpeg))  result = true;
    }
 
    if ((obj1.TexMipMap) && (!obj2.TexMipMap)) result = true;
    if ((obj1.TexGray)   && (!obj2.TexGray))   result = true;
 
    // Возвращаем результат сравнения размеров
    int width1  = obj1.TexWidth;
    int height1 = obj1.TexHeight;
    int width2  = obj2.TexWidth;
    int height2 = obj2.TexHeight;
    // Хотябы один размер был больше
    if ( ((width1  > width2) && (width1  > height2)) ||
         ((height1 > width2) && (height1 > height2)) ) result = true;*/    
    return result;
};
Пояснения!
1) Переменные bool sortmem_apartscenes и bool sortmem_apartjpeg являются глобальными. Увы от них избавится не вышло а добавлять еще 3 варианта сортировки было бы некрасиво. Перед сортировкой эти переменные устанавливаются в нужное значение.

2) Переменные TexJpeg TexMipMap и TexGray пробывал сравнивать знаком > но все равно безрезультатно.

3) bool result - это якобы варинт написания функции как в Дельфи. Просто во время отладки я заметил очень странную весчь. Оказывается в PREDICATE функции при к примеру "return true" не происходит выход из функции а продолжает обрабатывать всею последующие команды Я не понимать что это за баг?

4) Если проверять по отдельности то разделив на 3-и блока всю функцию сортировки

- мы получим что 1-ый блок с сортировкой по алфавиту, не выполняется (хотя список элементов string успешно сортирует имена файлов но только в другом участке в другом контейнере в моей работе)

- 2 блок кода выполняется только отдельно к примеру только сортировка по JPEG аттрибуту.

- 3 блок сортироки по размерам блестяще выполняется.

ПРИТОМ! Если по всем 3 блокам одновременно я пытаюсь сортировать данный список то у меня получается что
1) По именам сцен сортирует но имена сцен и без того изначально были уже в отсортированном виде еще при добавлении в список элементов (отсортировать в обратном порядке при изменении знака > на знак < ничего не меняется но если блок убрать то порядок теряется)
2) Также сортирует по именьшению сверху вниз размеров текстур.
Аттрибуты же текстур остаются в произвольном порядке....


Как это можно вылечить. Может кто уже сталкивался со сложными сортировками?

Добавлено через 3 часа 58 минут 39 секунд
Вопрос был решен на rsdn.ru
Вот Цитата:
От: Jenkas
Дата: 18.07.09 22:11
Здравствуйте, tatsu, Вы писали:

T>ЭТО НЕ ОЗНАЧЕТ СДЕЛАТЬ 3 РАЗНЫХ СОРТИРОВКИ!!! ЭТО ЗНАЧИТ ЧТОБЫ СВЕРХУ ВНИХ ОБЪЕКТЫ БЫЛИ ОТСОРТИРОВАННЫ ПО ДАННЫМ КРИТЕРИЯМ!

T>Т.е.
T>1) Scene1 JPEG MIPMAP GRAY 1000x900
T>2) Scene1 JPEG MIPMAP GRAY 800x900
T>3) Scene1 JPEG MIPMAP 1000x900
T>4) Scene1 JPEG MIPMAP 700x700
T>5) Scene1 JPEG GRAY 1500x1500
T>6) Scene1 JPEG GRAY 700x700
T>7) Scene1 JPEG 2000x700
T>8) Scene1 JPEG 1000x700
T>8 ) Scene1 100x100
T>9 ) Scene1 100x50
T>10) Scene2 .......

T>Т.е. номера пунктов 3-ех аттрибутов являются как бы приоритетами (важностью) 1) 2) 3)


В вашей функции есть ошибка. Продолжать проверку по след. приоритетному атрибуту стоит только если предидущик атрибуты были равны.

Попробуйте так:
bool PackPred(PackObject &obj1, PackObject &obj2)
{
if (sortmem_apartscenes)
{
string str1 = obj1.SceneAlias;
string str2 = obj2.SceneAlias;
if (str1 > str2) {
return true; //немедленый выход, если больше
}
if (str1 < str2) {
return false; //немедленый выход, если меньше
}
}
//если равно то делаем проверку по след. параметру
if (sortmem_apartjpeg)
{
// Объекты одной сцены сортируем по параметрам текстуры
if ((obj1.TexJpeg) && (!obj2.TexJpeg)) {
return true; //немедленый выход, если больше
}
if ((!obj1.TexJpeg) && (obj2.TexJpeg)) {
return false; //немедленый выход, если меньше
}
}
//если равно то делаем проверку по след. параметру
if ((obj1.TexMipMap) && (!obj2.TexMipMap)) {
return true; //немедленый выход, если больше
}
if ((!obj1.TexMipMap) && (obj2.TexMipMap)) {
return false; //немедленый выход, если меньше
}
//если равно то делаем проверку по след. параметру
if ((obj1.TexGray) && (!obj2.TexGray)) {
return true; //немедленый выход, если больше
}
if ((!obj1.TexGray) && (obj2.TexGray)) {
return false; //немедленый выход, если меньше
}
//если равно то делаем проверку по след. параметру
// Возвращаем результат сравнения размеров
int width1 = obj1.TexWidth;
int height1 = obj1.TexHeight;
int width2 = obj2.TexWidth;
int height2 = obj2.TexHeight;
// Хотябы один размер был больше
if ( ((width1 > width2) && (width1 > height2)) ||
((height1 > width2) && (height1 > height2)) )
return true; //немедленый выход, если больше
//и т.д.
return false;
};
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2009, 01:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос (STL LIST SORT) Сортировка по некольким критериям (C++):

Не работает сортировка Stl sort - C++
вот код сортировки массива обычным stl sort () #include&lt;conio.h&gt; #include&lt;iostream.h&gt; #include&lt;vector.h&gt; #include&lt;algorithm&gt; ...

List STL сортировка и поиск - C++
Ребят, прошу помощи. Перерыл весь инет, нашёл кучу ссылок, пытался сделать поиск и сортировку, ни чего не получается. Помогите пожалуйста,...

Поиск и сортировка list STL - C++
Здравствуйте формумчане. Такая проблема. Написал почти рабочий код, но столкнулся с 2-мя проблемами. Первая: не могу понять как...

Сортировка диапазона элементов в list (STL) - C++
Здравствуйте! Требуется ввести числа в список, задать числа a и b, изменить порядок элементов, начиная с a-го элемента, заканчивая b-ым...

STL sort() - C++
кто знает и где можно посмотреть за какое время работает сортировка sort() в STL &lt;algorithm&gt;??

stl sort vector не сортирует ?! - C++
class Playlist { private: std::vector&lt;Song&gt; s_container; public: Playlist() { s_container=std::vector&lt;Song&gt;(); } ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.07.2009, 07:32 #2
ну, он предложил сделать многоэтажный if
который будет пропорционален этой конструкции

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct PackObject
{
    bool            Placed;         // Помещен ли на карту текстур
    string          SceneAlias;     // Имя сцены
 
    string          TexFile;
    int             TexWidth;
    int             TexHeight;
    bool            TexMipMap;
    bool            TexGray;
    bool            TexJpeg;
 
    string          ObjAlias;          // Имя родительского объекта
    TRect           ObjRect;
    int             AniFrameNumber;    // Порядковый номер кадра
    int             AniFrames;
    int             AniFramesPerLine;
};
короче говоря, из-за этого if'а ты её не сможешь расширять, если вдруг тебе понадобится не пять полей а пятьсот - можешь забыть

я писал нечто подобное когда нужно было проводить такие сортировки, у меня была функция сортировки, но она знала откуда и докуда сортировать, а ей передавался указатель на свапер, который знал какие поля менять местами
и функция подсчёта полей, которая принимала указатель на функцию для определения одинаковости полей, которая могла посчитать эти границы

в итоге там расширение свелось к тому, чтобы продлить цикл сортирования, написать функцию сравнения для определения одинаковости, и функцию перестановки для определённого поля
так можно было добавить любое поле

ну и переделать, когда бывает нужно переделать, тоже было легко и просто, потому что всё это было собрано по частям, отдельным и самостоятельным

Добавлено через 23 минуты 24 секунды
а, ну ясно, это я попутал насчёт многоэтажки
он юзает короче передачу двух объектов в функцию и сравнения каждого поля, так что насчёт расширяемости у него всё нормально

Добавлено через 2 часа 41 минуту 40 секунд
короче, суть в том чтобы сортировать колонки постепенно и отсортированное оставлять, а неотсортированное сортировать
и функция сортировки свой фокус перемещает за счёт маленьких функций, которые и определяют одна - где начинать сортировку и докуда проводить, а вторая - какие менять элементы, в какой колонке
ну, там задача была другая (не было чёткого формата, количество колонок могло меняться, очерёдность тоже - нужно было всё учесть заранее чтобы не переписывать десять раз)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2009, 07:32
Привет! Вот еще темы с ответами:

реализация Shell Sort в stl - C++
Всем привет! Кто-нибудь знает, есть ли в Stl реализация сортировки Шелла? std::sort() реализован на основе быстрой сортировки, есть...

Работа с STL list + пропись List.h - C++
Здравствуйте! Помогите, пожалуйста, разобраться с STL list. Нужно сделать программу в которой будет содержаться класс Student, прописать...

С++ Builder STL copy/sort multiset - C++
есть две проблемы: 1) ф-ция copy не компилируеться multiset&lt;double&gt; MS,MS2; multiset&lt;double&gt;::iterator msIter; ///здесь...

STL sort строк string по убыванию - C++
Как по возрастанию - знаю:std::vector&lt;std::string&gt; obj; std::string str(&quot;asdfghjkl&quot;); vector.push_back(str); for (auto &amp;index : obj)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru