Рассмотрим следующий код:станд :: сортировки не всегда называют станд :: своп
#include <algorithm>
#include <iostream>
#include <vector>
namespace my_space
{
struct A
{
double a;
double* b;
bool operator<(const A& rhs) const
{
return this->a < rhs.a;
}
};
void swap(A& lhs, A& rhs)
{
std::cerr << "My swap.\n";
std::swap(lhs.a, rhs.a);
std::swap(lhs.b, rhs.b);
}
}
int main()
{
const int n = 20;
std::vector<my_space::A> vec(n);
for (int i = 0; i < n; ++i) {
vec[i].a = -i;
}
for (int i = 0; i < n; ++i) {
std::cerr << vec[i].a << " ";
}
std::cerr << "\n";
std::sort(vec.begin(), vec.end());
for (int i = 0; i < n; ++i) {
std::cerr << vec[i].a << " ";
}
std::cerr << "\n";
}
Если я использую n=20
, функция пользовательской замены называется и массив отсортирован. Но если я использую n=4
, массив сортируется правильно, но пользовательская функция свопинга - , а не. Почему это? Что делать, если мне действительно дорого копировать мои объекты?
Для этого теста я использовал gcc 4.5.3.
[Этот вопрос] (http://stackoverflow.com/questions/6380862/how-to-provide-a-swap-function-for-my-class) должен быть полезен. – chris
Кстати, зачем использовать 'std :: cerr' для нормального вывода? – Nawaz
Я не использую 'cerr' для нормального вывода. Я использую 'cout' для нормального вывода и' cerr' для сообщений об ошибках, диагностики и отладки. В этом случае, я полагаю, я мог бы использовать 'cout'. – Petter