Postanowiłem zgłębić tajniki kontenera set, w związku z czym wyprodukowałem taki fragment kodu:
#include <iostream>
#include <set>
class liczba
{
private:
unsigned long long int x;
public:
liczba() : x(0) {}
liczba(unsigned long long int y) : x(y) {}
unsigned long long int get() const {return(x);}
bool operator<(liczba const & o) const {return(x < o.get());}
//bool operator<=(liczba const & o) const {return(x <= o.get());}
//bool operator>(liczba const & o) const {return(x > o.get());}
//bool operator>=(liczba const & o) const {return(x >= o.get());}
//bool operator==(liczba const & o) const {return(x == o.get());}
friend std::istream& operator>> (std::istream &inp, liczba & r)
{inp >> r.x; return inp;}
friend std::ostream & operator<< (std::ostream &out, const liczba &s)
{return out << s.get();}
};
template <typename T>
void add(std::set<T> & tmp, unsigned long long int ile)
{
T m;
while(ile--)
{
std::cin>>m;
tmp.insert(m);
}
std::cout<<"\n";
}
template <typename T>
void write(const std::set<T> tmp)
{
typename std::set<T>::iterator it;
for(it=tmp.begin();it!=tmp.end(); it++)
std::cout<<*it<<"\n";
}
int main()
{
const unsigned long long int c = 3; //elementy do dodania
std::set<liczba> tab;
add(tab, c);
write(tab);
return(0);
}
Zdziwiło mnie to, że do jego działania wystarczy jeden operator: "<". Jego działanie rozumiem w ten sposób, że dodaje on obiekty, które są automatycznie sortowane z pominięciem duplikatów. O ile jakieś tam sortowanie to da się przeprowadzić za pomocą tego jednego operatora, to zapobieżenie przed dodaniem duplikatu bez jakiegokolwiek porównania już chyba nie bardzo. Albo ja nie do końca rozumiem jego ideę. Wie ktoś jak to działa, ale tak "od środka"?