Здравствуйте, 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());
//...
}
Здравствуйте, 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>>