Si consideri il seguente codice:std :: sort non sempre chiamare 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";
}
Se uso n=20
, la funzione di scambio personalizzato è chiamato e l'array è ordinato. Ma se utilizzo n=4
, la matrice è ordinata correttamente, ma la funzione di scambio personalizzato è chiamata. Perché? E se fosse davvero costoso copiare i miei oggetti?
Per questo test, stavo usando gcc 4.5.3.
[Questa domanda] (http://stackoverflow.com/questions/6380862/how-to-provide-a-swap-function-for-my-class) dovrebbe essere utile. – chris
BTW, perché usare 'std :: cerr' per l'output normale? – Nawaz
Non uso 'cerr' per l'output normale. Uso 'cout' per output normale e' cerr' per messaggi di errore, diagnostica e debug. In questo caso, suppongo che avrei potuto usare 'cout'. – Petter