【发布时间】:2011-08-27 06:05:12
【问题描述】:
我正在实现一个具有复杂模板参数类型的 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
我希望我缺少一些信息。我是否可以同时拥有最少的对象实例化和适当的排序?
【问题讨论】:
-
为什么你认为复制构造函数很昂贵而使用运算符
new不是? -
贵吗?我不明白你的问题(也许你不明白我的)。我的问题是 both 每次插入都会调用一个复制构造函数和构造函数(两个对象)。我不在乎哪个更贵。两者的总和是我试图避免的。
-
我会尽量避免使用
new,因为我知道那很昂贵。可能比额外的构造函数更昂贵。