|
|
(не показано 8 промежуточных версий этого же участника) |
Строка 1: |
Строка 1: |
− | ===Не работает, сортировка(std::sort) контейнера указателей?=== | + | ==Ответы на часто задаваемые вопросы по [[STL]].== |
− | std::sort сортирует контейнер применяя оператор < или less к элементам контенера в контенере лежат указатели и как следствие будут от сортированны именно указатели, если нужно, что при сортировке анализировали данные хранящиеся по указалелю, то в std::sort следует передать предикат сравнения который умеет, залазить в данные хранящиеся по указателю.
| + | Составлено по материалам [http://forum.shelek.ru форума программистов]. |
− | вот простой пример:
| + | |
− | <pre>
| + | |
− | 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[])
| + | #[[FAQ:STL:сортировка контейнера указателей|Не работает, сортировка контейнера указателей (std::sort)?]] |
− | {
| + | #[[FAQ:STL:C++ сериализация данных|C++ сериализация данных]] |
− |
| + | [[Category:FAQ]] |
− | std::vector<int*> v_int;
| + | [[Category:FAQ:STL]] |
− | | + | |
− | 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;
| + | |
− | }
| + | |
− | </pre>
| + | |
− | | + | |
− | эту особенность работы алгоритмов STL нужно учитывать и при работе с другими алгоритмами(find, lower_bound, equival_range и т.д.)
| + | |
− | Так же не следует забывать об очистке памяти
| + | |