FAQ:STL
Материал из Весельчак У
Не работает, сортировка(std::sort) контейнера указателей?
std::sort сортирует контейнер применяя оператор < или less к элементам контенера в контенере лежат указатели и как следствие будут от сортированны именно указатели, если нужно, что при сортировке анализировали данные хранящиеся по указалелю, то в std::sort следует передать предикат сравнения который умеет, залазить в данные хранящиеся по указателю. вот простой пример:
void print_elem(int* i) { std::cout << *i << "\n"; } // предикат для сравнения данных хранящихся по указателю template<class T> bool ptr_less(const T* lhs, const T* rhs) { return *lhs < *rhs; } int _tmain(int argc, _TCHAR* argv[]) { std::vector<int*> v_int; for (int i=0; i < 10; ++i) v_int.push_back(new int(10-i)); std::cout << "Before sort:\n"; std::for_each(v_int.begin(),v_int.end(),&print_elem); std::sort(v_int.begin(),v_int.end()); std::cout << "After simple sort:\n"; std::for_each(v_int.begin(),v_int.end(),&print_elem); std::sort(v_int.begin(),v_int.end(),&ptr_less<int>); std::cout << "After sort:\n"; std::for_each(v_int.begin(),v_int.end(),&print_elem); return 0; }
эту особенность работы алгоритмов STL нужно учитывать и при работе с другими алгоритмами(find, lower_bound, equival_range и т.д.) Так же не следует забывать об очистке памяти