C++ 过载操作员<;在使用std::set时

C++ 过载操作员<;在使用std::set时,c++,set,std,operator-keyword,C++,Set,Std,Operator Keyword,这是我第一次使用std::set容器,但是我遇到了运算符std::less的问题 我宣布: std::set<MyClass*, std::less<MyClass> > _set; std::set\u set; 然后,我重载了操作符您只想使用std::set。比较器默认为std::less您重载的运算符使用原始指针容器的任何设计都会被破坏。你的问题只是另一个证明,因为它甚至让你感到困惑@Griwes这是错的std::map是std::map最常用的用法之一。您不能

这是我第一次使用std::set容器,但是我遇到了运算符std::less的问题

我宣布:

std::set<MyClass*, std::less<MyClass> > _set;
std::set\u set;

然后,我重载了操作符您只想使用
std::set
。比较器默认为
std::less

您重载的
运算符使用原始指针容器的任何设计都会被破坏。你的问题只是另一个证明,因为它甚至让你感到困惑@Griwes这是错的<使用原始指针作为映射类型的code>std::map
std::map
最常用的用法之一。您不能使用
std::less
,因为它不是用于比较
MyCLass*
s的函数。相反,您应该编写自己的比较函数<代码>结构Cmp{bool操作符()(const MyClass*p_lhs,const MyClass*p_rhs)const{return*p_lhs<*p_rhs;}并将其指定为
集合的第二个模板参数
@Griwes(并且没有看到他的代码的任何其他内容),我怀疑这里的正确答案是使用值。由于java等语言,大量C++初学者在不应该使用动态分配时使用。在这种情况下,正确的答案是使用值,而不是用智能指针模拟Java的垃圾收集。一旦消除了这些情况,智能指针的情况就基本消失了。几乎所有带有指针的关联容器都用于导航。这在很大程度上取决于
集合的用途。如果使用指针的原因是对象位于其他位置,那么他必须使用原始指针。(我不认为我遇到过将智能指针放入
集合
)的情况()“请注意,shared_ptr的比较运算符只是比较指针值;指向的实际对象不进行比较。”@JamesKanze,我刚才给了你一个例子,在类型上的set-enablic多态性中放置智能指针。@Griwes但是非实体类型多态性的频率是多少?鉴于他似乎相对较新,建议使用价值语义学是个好主意。但如果价值语义不适用,建议智能指针指向相对较新的人是个坏主意;“真正合适的情况很少,”相反,詹姆斯坎泽;向相对较新的人介绍原始指针是个坏主意。在原始指针之前和容器之后引入智能指针(因为这个问题是关于
std::set
,我认为我们已经达到了这一点)是教授该语言的明智方法。或者专门化
std::less
并缩短
set
声明。
no match for call to '(std::less<MyClass>) (MyClass *const&, MyClass *const&)'
struct Comp
{
    bool operator()(MyClass* x, MyClass* y);
};

std::set<MyClass*, Comp> _set;