Если третий аргумент для std::sort()
не указан, объекты сортируются с использованием operator<
, например:
if (a < b) {
// ...
}
Таким образом, все, что вам нужно для сортировки объектов типа Foo
, это иметь либо:
bool Foo::operator< (const Foo& rhs) const;
или
bool operator< (const Foo& lhs, const Foo& rhs);
При этом, если у вас есть массив указателей , вам нужно будет предоставить пользовательский предикат, если вы не хотите сортировать объекты по их адресу в памяти (я очень сомневаюсь, что это то, что вам нужно) , Вы можете сделать что-то вроде:
template<class T>
struct sort_by_pointee {
bool operator() (const T* lhs, const T* rhs) const
{
return (*lhs < *rhs);
}
};
И используйте это как:
std::vector<Foo*> foos;
// ...
std::sort(foos.begin(), foos.end(), sort_by_pointee<Foo>());
Редактировать : пример, который вы разместили, будет работать нормально и сортировать данные, но вектор не действует как прокси для данных, хранящихся в массиве itemPtr
. Прочитайте это снова с моими аннотациями:
{
vector<Type> myvector (itemPtr, itemPtr+8);
// 'myvector' holds a copy of the first 8 elements in the 'itemPtr' array.
sort (myvector.begin(), myvector.end());
// contents of 'myvector' are sorted, but this is a copy of 'itemPtr''s
// contents, so items in 'itemPtr' are still in their original order.
}
Если вы хотите отсортировать содержимое [itemPtr,itemPtr+8)
на месте, вы можете просто сделать:
std::sort(itemPtr, itemPtr+8); // use custom predicate if required.
Редактировать : ОК, следуя опубликованному вами коду, я бы исправил метод readFile()
из его исходного определения в:
template <class Type>
void List<Type>::readFile(Field path)
{
ifstream file(path.c_str());
if(!file.is_open()) {
cout << "Error opening file\n";
}
for (Type item; file >> item;) {
addItem(item);
}
sort (itemPtr, itemPtr+used);
}