STL: сортировка вектора
От: vodolas  
Дата: 10.06.08 11:47
Оценка:
Народ!!
О задаче:
имеется какой-то заполненный грид. Надо его отсортировать. Для повышения быстродействия кеширую все данные в std::vector GridData. Т.к. ветор одномерен — пытаюсь селать его с разным наполнением:
1) std::vector<String *> GridData;. Потом при заполнении происходит создание массива:
GridData[i] = new AnsiString [FieldsHeader.size()];
2)Создаю вектор с struct TRow
{
AnsiString * Rows;
int RowCount;
int OrderCol;
};
std::vector<TRow> GridData;
Инициализация:
GridData[i].Rows = new AnsiString [FieldsHeader.size()];

Возникла необходимость отсортировать по одному из столбцов. Как это сделать?
Для обычного вектора идет перегрузка оператора operator< и потом std::sort(GridData.begin(), GridData.end());
А как здесь? Просто я пробовал перегрузку в первом случае, но не сортируется.
Во втором случае не могу перегрузить операнд.
КАк лучше подойти к вопросу?
Re: STL: сортировка вектора
От: alzt  
Дата: 10.06.08 12:04
Оценка:
Здравствуйте, vodolas, Вы писали:

Небольшой пример:

struct MyPred : public std::binary_function<int*,int*, bool>
{
    bool operator()(int* a, int* b)
    {
        return (*a<*b);
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
        vector<int*> v;
    v.push_back(new int(1));
    v.push_back(new int(3));
    v.push_back(new int(4));
    v.push_back(new int(2));

    sort(v.begin(),v.end(), MyPred());
        //...
}
Re: STL: сортировка вектора
От: Кодт Россия  
Дата: 10.06.08 12:33
Оценка:
Здравствуйте, vodolas, Вы писали:

V>имеется какой-то заполненный грид. Надо его отсортировать. Для повышения быстродействия кеширую все данные в std::vector GridData. Т.к. ветор одномерен — пытаюсь селать его с разным наполнением:

V>1) std::vector<String *> GridData;. Потом при заполнении происходит создание массива:
V>GridData[i] = new AnsiString [FieldsHeader.size()];

Зачем вектор голых динамических массивов? Почему не вектор векторов (или, лучше, вектор умных указателей на векторы)?

V>Возникла необходимость отсортировать по одному из столбцов. Как это сделать?

V>Для обычного вектора идет перегрузка оператора operator< и потом std::sort(GridData.begin(), GridData.end());
V>А как здесь? Просто я пробовал перегрузку в первом случае, но не сортируется.
V>Во втором случае не могу перегрузить операнд.

Конечно, перегрузить operator<(String*,String*) нельзя.
Но вместо этого можно подсунуть функции sort любой предикат сравнения, работающий аналогично оператору <.
struct CompareStringArrays
{
    size_t size; // откуда-то нужно же знать о длине массивов; вот почему лучше не голые массивы, а вектора
    explicit CompareStringArrays(size_t s) : size(s) {}
    
    bool operator() (String* xs, String* ys) const
    {
        return std::lexicographical_compare(xs, xs+size, ys, ys+size);
    }
};

.....

std::sort(GridData.begin(), GridData.end(), CompareStringArrays(FieldsHeader.size()));
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.