FAQ:STL

Материал из Весельчак У
Версия от 21:25, 8 апреля 2008; RXL (обсуждение | вклад) (Категория FAQ)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Не работает, сортировка(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 и т.д.) Так же не следует забывать об очистке памяти