FAQ:STL:сортировка контейнера указателей — различия между версиями

Материал из Весельчак У
Перейти к: навигация, поиск
(Ветвление FAQ:STL)
 
 
(не показаны 3 промежуточные версии этого же участника)
Строка 4: Строка 4:
  
 
Вот простой пример:
 
Вот простой пример:
<pre>
+
<syntaxhighlight lang="cpp">
 
void print_elem(int* i)
 
void print_elem(int* i)
 
{
 
{
Строка 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;
 
}
 
}
</pre>
+
</syntaxhighlight>
  
 
Эту особенность работы алгоритмов STL нужно учитывать и при работе с другими алгоритмами (find, lower_bound, equival_range и т.д.). Так же не следует забывать об очистке памяти.
 
Эту особенность работы алгоритмов STL нужно учитывать и при работе с другими алгоритмами (find, lower_bound, equival_range и т.д.). Так же не следует забывать об очистке памяти.
  
[[Category FAQ:STL]]
+
[[Category:FAQ]] [[Category:FAQ:STL]]

Текущая версия на 22:05, 4 октября 2009

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