Я реализую набор STL со сложным типом параметра шаблона.Вставляя в набор, я хочу, чтобы набор использовал оператор меньше, чем я определил для моего типа.Я также хочу минимизировать количество экземпляров объектов моего типа.Кажется, у меня не может быть обоих.
У меня есть два минимальных примера ниже, каждый использует один и тот же класс C ++.
#include <iostream>
#include <set>
using namespace std;
class Foo {
public:
Foo(int z);
Foo(const Foo &z);
bool operator<(const Foo &rhs) const;
int a;
};
Foo::Foo(int z)
{
cout << "cons" << endl;
a = z;
}
Foo::Foo(const Foo &z)
{
cout << "copy cons" << endl;
a = z.a;
}
bool
Foo::operator<(const Foo &rhs) const
{
cout << "less than" << endl;
return a < rhs.a;
}
Вот мой первый метод main ():
int
main(void)
{
set<Foo> s;
s.insert(*new Foo(1));
s.insert(*new Foo(2));
s.insert(*new Foo(1));
cout << "size: " << s.size() << endl;
return 0;
}
Это здорово, потому что он использует меньше, чем я определил для моего класса, и, следовательно, размер набора правильно равен двум.Но это плохо, потому что каждая вставка в набор требует создания двух объектов (конструктор, конструктор копирования).
$ ./a.out
cons
copy cons
cons
less than
less than
less than
copy cons
cons
less than
less than
less than
size: 2
Вот мой второй метод main ():
int
main(void)
{
set<Foo *> s;
s.insert(new Foo(1));
s.insert(new Foo(2));
s.insert(new Foo(1));
cout << "size: " << s.size() << endl;
return 0;
}
Это здоровопотому что для вставки требуется только один экземпляр объекта.Но это плохо, потому что это действительно набор указателей, и, таким образом, уникальность членов набора не учитывается в моем типе.
$ ./a.out
cons
cons
cons
size: 3
Я надеюсь, что мне не хватает некоторой информации,Могу ли я иметь как минимальные экземпляры объектов, так и соответствующую сортировку?