Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [Vector] Сортировка вектора... BorlandC++ 6.0 E  (Прочитано 9494 раз)
0 Пользователей и 1 Гость смотрят эту тему.
godlsd
Гость
« : 22-08-2009 09:11 » 

сначала заинклудил <vector.h>

есть элемент вектора
Код:
class cOpenListElem{
public:
        short nXPos;
        short nYPos;
        short nParXPos;
        short nParYPos;
        int nFCost;
        int nHCost;
        int nGCost;
        cOpenListElem(void);
        cOpenListElem(short nGetXPos,short nGetYPos,int nGetHCost,int nGetFCost);
};
и сам вектор
vector<cOpenListElem> OpenList;

нужно как можно быстрее отсортировать элементы вектора по nFCost;

нашол что-то про sort();
во первых мой компиллер какого-то хрена не видит эту функцию, во вторых, помоему там нету выборки по значению элемента вектора=)
Шо робыть=)Не понял
« Последнее редактирование: 22-08-2009 16:55 от Вад » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 22-08-2009 16:54 » 

В STL есть обобщённый алгоритм sort. Не знаю, как называется заголовок с этой функцией в Borland C++ 6, в современных версиях он находится в заголовке algorithm. Для того, чтобы использовать эту сортировку для упорядочения по одному из полей, нужно написать фукнцию/функтор для сравнения cOpenListItem.
Что-то типа
Код:
#include <vector>
#include <algorithm>
class cOpenListElem{
public:
// ...
        int nFCost;
// ...
        static bool less(const cOpenListElem& left, const cOpenListElem& right){
                return left.nFCost < right.nCost;
        }
};

void foo(){
        std::vector<cOpenListElem> OpenList;
        // ...
       std::sort(OpenList.begin(), OpenList.end(), cOpenListElem::less);
}
Код не проверял, инклуды в соответствии со стандартом, и организовать можно немного по-другому - просто как вариант (возможно, лучше использовать специализацию std::less для cOpenListElem).
« Последнее редактирование: 22-08-2009 16:56 от Вад » Записан
godlsd
Гость
« Ответ #2 : 26-08-2009 12:14 » 

Чёт не пипчит у меня эта штука=(
Код:
bool cAStar::GetPath(sPathPoint &lpPointA,sPathPoint &lpPointB,sGATBlock* lpGAT){
        bStatus=false;
        sCurrentPoint CurrentPoint;
        std::vector<cOpenListElem> OpenList;
        std::vector<cCloseListElem> CloseList;
        if(lpGAT[lpPointA.nYPos*map.MapData.XSize+lpPointA.nXPos].type!=1&&lpGAT[lpPointB.nYPos*map.MapData.XSize+lpPointB.nXPos].type!=1){
        OpenList.push_back(cOpenListElem(lpPointA.nXPos,lpPointA.nYPos,0x0,0x0,0x0,10*(abs(lpPointA.nXPos-lpPointB.nXPos)+abs(lpPointA.nYPos-lpPointB.nYPos)))); //Äîáàâèëè òî÷êó À â îòêðûòûé ñïèñîê
        //Ñîðòèðîâêà îòêðûòîãî ñïèñêà
        std::sort(OpenList.begin(),OpenList.end(),cOpenListElem::less);

                while(true){
                                if(lpGAT[CurrentPoint.nYPos*map.MapData.XSize+CurrentPoint.nXPos].type!=1&&  //Åñëè òî÷êà ïðîõîäèìà è íå âûõîäèò çà ãðàíè ýêðàíà
                                CurrentPoint.nXPos>=0&&CurrentPoint.nXPos<(map.MapData.XSize-1)&&
                                CurrentPoint.nYPos>=0&&CurrentPoint.nYPos<(map.MapData.YSize-1)){
                                        ;
                                }
                }
        }
        return bStatus;
}
« Последнее редактирование: 26-08-2009 12:32 от Finch » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 26-08-2009 12:33 » 

А что именно? Или надо догадываться?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
godlsd
Гость
« Ответ #4 : 26-08-2009 12:45 » 

сори башка болит забыл сказать где ошибка=)
в общем запрыгивает в algo.c
Код:
// partial_sort, partial_sort_copy, and auxiliary functions.

template <class _RandomAccessIter, class _Tp, class _Compare>
void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
                    _RandomAccessIter __last, _Tp*, _Compare __comp) {
  make_heap(__first, __middle, __comp);
  for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
    if (__comp(*__i, *__first))
      __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
                 _STLP_DISTANCE_TYPE(__first, _RandomAccessIter));
  sort_heap(__first, __middle, __comp);
}

и тут говорит Call of nonfunction.....
« Последнее редактирование: 26-08-2009 12:48 от Finch » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines