Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация нахождения элементов в векторе 
:(
    Опции темы
Paspartu
Дата 26.9.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



Доброго времени суток.

Помогите сделать оптимизацию.

Есть следующие классы:

Код

class A
{
    //....
    int nID;
    POINT ptPos;
//....
};

class B
{
    //....
    vector <A*>pA_Vect;
    BOOL GetProperties(int nLevel, Properties* pPrp);
//....
};

struct Properties
{
    //....
    int nStart;
    int nEnd;
//....
};

//.....

BOOL B::GetProperties(int nLevel, Properties* pPrp)
{
    //...
    pPrp-> nStart = -1;
    pPrp-> nEnd  = -1;

    int nSize = this->pA_Vec.size();
    for(int n = 0; n < nSize; n++)
{
    if(this->pA_Vec[n]-> ptPos.y == nLevel)
    {
        (pPrp-> nStart == -1)? pPrp-> nStart = n:NULL;
        pPrp-> nEnd  = n;
    }
}
    //...
}



Вопрос такой надо в векторе находить элементы по заданному критерию, в данном случае те у которых this->pA_Vec[n]-> ptPos.y == nLevel (т.к. эти элементы обязательно стоят по порядку, то находить индекс первого и последнего элемента удовлетворяющих критерию) затем с этими элементами производится ряд других действий.
Кроме как сделать структуру Properties и в дальнейшем работать с ней я больше ничего не придумал...
Так как эта функция вызывается очень много раз то возник вопрос ее оптимизации.
Возможно ли использовать итераторы? На много ли это повысит производительность?

P.S. Пишу по памяти, возможны синтактические ошибки.



PM MAIL   Вверх
Alek86
Дата 26.9.2008, 09:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Paspartu, может, лучше использовать set или multiset?


--------------------
user posted image    user posted image
PM MAIL   Вверх
georain
Дата 26.9.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Paspartu, если элементы в векторе изменяются очень редко, то при каждом добавлении вместо push_back() можно делать insert() в нужную позицию, чтобы вектор всегда был отсортированным. Тогда можно будет сказать что все элементы после заданного больше (меньше или какой критерий сортировки) этого и твой алгоритм будет работать. Ну и соответственно у элементов вектора изменять нельзя данные-критерий сортировки (у тебя это ptPos.y), для этого придётся этот элемент выдернуть и вставить на новое место. По быстродействию все будет идеально пока элементы вектора будут изменяться очень редко.
Если они изменяются достаточно часто используй set, multiset, map или multimap. Там используются автоматическая сортировка при вставке, но для их использования нужно будет использовать итераторы. При частом изменении элементов эти контейнеры в твоей задаче будут работать более эффективно.

Это сообщение отредактировал(а) georain - 26.9.2008, 15:10
PM MAIL   Вверх
Earnest
Дата 26.9.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Paspartu @  26.9.2008,  10:35 Найти цитируемый пост)
т.к. эти элементы обязательно стоят по порядку

Это означает, что элементы отсортированы по y? Если да, то используй equal_range и соответствующий предикат.



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.