FAQ:STL:сортировка контейнера указателей — различия между версиями
Материал из Весельчак У
RXL (обсуждение | вклад) (→Не работает, сортировка контейнера указателей (std::sort)?) |
RXL (обсуждение | вклад) м |
||
Строка 22: | Строка 22: | ||
std::vector<int*> v_int; | std::vector<int*> v_int; | ||
− | for (int i=0; i < 10; ++i) | + | for (int i = 0; i < 10; ++i) |
− | v_int.push_back(new int(10-i)); | + | v_int.push_back(new int(10 - i)); |
std::cout << "Before sort:\n"; | std::cout << "Before sort:\n"; | ||
− | std::for_each(v_int.begin(),v_int.end(),&print_elem); | + | std::for_each(v_int.begin(), v_int.end(), &print_elem); |
− | std::sort(v_int.begin(),v_int.end()); | + | std::sort(v_int.begin(), v_int.end()); |
std::cout << "After simple sort:\n"; | std::cout << "After simple sort:\n"; | ||
− | std::for_each(v_int.begin(),v_int.end(),&print_elem); | + | std::for_each(v_int.begin(), v_int.end(), &print_elem); |
− | std::sort(v_int.begin(),v_int.end(),&ptr_less<int>); | + | std::sort(v_int.begin(), v_int.end(), &ptr_less<int>); |
std::cout << "After sort:\n"; | std::cout << "After sort:\n"; | ||
− | std::for_each(v_int.begin(),v_int.end(),&print_elem); | + | std::for_each(v_int.begin(), v_int.end(), &print_elem); |
return 0; | return 0; | ||
} | } |
Версия 08:54, 30 июля 2008
Не работает, сортировка контейнера указателей (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 и т.д.). Так же не следует забывать об очистке памяти.