Rozważmy następujący kod:std :: sort nie zawsze zadzwonić std :: Swap
#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";
}
Jeśli używam n=20
zwyczaj swap nazywa i tablica jest posortowana. Ale jeśli używam n=4
, tablica jest posortowana poprawnie, ale niestandardowa funkcja wymiany to , a nie. Dlaczego? A co, jeśli kopiowanie moich obiektów jest naprawdę kosztowne?
Do tego testu użyłem gcc 4.5.3.
[To pytanie] (http://stackoverflow.com/questions/6380862/how-to-provide-a-swap-function-for-my-class) powinno być pomocne. – chris
BTW, dlaczego używać 'std :: cerr' dla normalnego wyjścia? – Nawaz
Nie używam 'cerr' dla normalnego wyjścia. Używam 'cout' dla normalnego wyjścia i' cerr' dla komunikatów o błędach, diagnostyki i debugowania. W tym przypadku przypuszczam, że mogłem użyć 'cout'. – Petter