На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Сортировка std::vector , Ben, I need help!
    Люди добрые, помоготе с сортировкой std::vector<char*> по алфавиту!
      std::sort ;)
        ExpandedWrap disabled
          std::sort(Vector.begin(), Vector.end());
          Цитата HOMO_PROGRAMMATIS @
          ExpandedWrap disabled
            std::sort(Vector.begin(), Vector.end());

          :) Хорошая сортировочка получится - по возрастанию указателя...
            std::sort(Vector.begin(), Vector.end()) - это я пробовал, только сортировка очень голимая:

            vec.push_back(" c ");
            vec.push_back(" a ");
            vec.push_back(" b ");
            vec.push_back(" e ");
            vec.push_back(" d ");

            результат printf:

            d e b a c

            т.е. как и сказал Hryak - это сортировка указателей по возрастанию, а не по алфавиту... помогите кто-нить с сабжем
              Sp@m
              Напиши свой функтор, который будет сравнивать строки, и передай его в std::sort
                Напиши свой функтор, который будет сравнивать строки - вот это-то и надо как-то сделать :)

                Добавлено
                причем алгоритм сортировки должен достаточно быстрым... я пишу свой ОпенДиалог для WinCE, поэтому от сортировки напрямую зависит скорость открытия каталога... жду помощи...
                  ExpandedWrap disabled
                    struct StrLess : public std::binary_function<const char*, const char*, bool>
                    {
                        bool operator ()(const char* s1, const char* s2) { return strcoll(s1, s2) < 0; }
                    };
                    ....
                    std::sort(vec.begin(), vec.end(), StrLess());
                    А, я просто не обратил внимания что там вектор не на стрингах :)
                      Hryak, БОЛЬШОЕ спасибо! держи +
                        а может кто сталкивался с сортировкой массива структур, т.е.

                        struct fff
                        {
                        char* stroka;
                        int a;
                        } dd;

                        создаем массив этих структур:
                        std::vector<fff> vec;

                        надо отсортировать структуры в массиве в алфавитном порядке по fff.stroka (переменная int a - в сортировке не нужна)
                          Sp@m, точно так же, как и подсказал Hryak:
                          ExpandedWrap disabled
                            struct FFFLess : public std::binary_function<fff, fff, bool>
                            {
                                 bool operator ()(fff &f1, fff &f2) { return strcoll(f1.stroka, f2.stroka) < 0; }
                            }
                          Хотя я бы сделал так:
                          ExpandedWrap disabled
                            struct fff
                            {
                                char* stroka;
                                int a;
                                bool operator < ( const fff &r ) { return strcoll( stroka, r.stroka ) < 0; }
                            };
                             
                            // сортировка
                            sort( vec.begin(), vec.end() );
                          Сообщение отредактировано: KAV -
                            Точно также:

                            ExpandedWrap disabled
                              struct FFFLess : public std::binary_function<fff, fff, bool>
                              {
                                  bool operator ()(fff s1, fff s2) { return strcoll(s1.stroka, s2.stroka) < 0; }
                              };
                              ....
                              std::sort(vec.begin(), vec.end(), FFFLess());
                              Всем еще раз огромное спасибо, держите +

                              Добавлено
                              только вот опять проблемка небольшая: сортировка через strcoll или strcmp или std::sort сортирует не очень хорошо по алфавиту, т.к. заглавные буквы идут в начале, потом строчные... для ОпенДиалога это не совсем гуд, надо бы чтоб если слова начинаются с букв 'A' или 'a', то чтоб они так и шли первыми, потом 'б' или 'Б'...
                              Если вышеупомянутый код можно безболезненно подкорректировать, помогите пожалуйста
                                Попробуй
                                ExpandedWrap disabled
                                  setlocale(LC_COLLATE, "Russian_Russia");
                                в начале программы
                                ;)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0385 ]   [ 16 queries used ]   [ Generated: 18.07.25, 13:11 GMT ]