c++ 中如何计数stl 设置工作吗?
因此,我试图检查集合中是否已存在特定对象。为此,我使用 count() 方法。现在,它似乎没有返回正确的答案。让我更清楚地解释一下问题 -
这种方式声明了一个类
class Node{
public:
Node(int _state=0, int _cost=0)
{
state = _state;
cost = _cost;
}
bool operator<(const Node& rhs)
{
return cost < rhs.cost;
}
bool operator==(const Node& rhs)
{
cout << "== operator method used" << endl;
if (rhs.state == state)
return true;
return false;
}
int state;
int cost;
};
我在代码中以
set<Node*> myset;
,我声明了一个这样的集合 -经过几次插入后, myset 是这样的 {{1, 5}, {2, 6 }, {3, 9}}
现在我检查 {1, 7} 是否是集合的一部分。它会怎样做呢?我在Node类中编写了一个operator==方法,但从未被调用过。那么 count() 在什么基础上检查对象是否已经在集合中?...我希望计数以这样的方式工作:如果 {1, 5} 已经在 myset 中,它应该查看 {1, 7} 作为重复条目。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
默认情况下它使用
operator<
。事实上,一般来说,C++ 标准库容器使用
!(a < b) && !(b < a)
来确定等价的属性。您可以通过向容器类型提供您自己的
Compare
模板参数来覆盖用于执行此检查的比较器,尽管很少有理由这样做 - 您通常应该简单地定义operator<
> 代替你的类型,就像你所做的那样。 (不过,请确保它创建了严格的弱排序。)不,你的集合从来不是这样的。您的集合包含指针,而不是
节点
。将其改为set
。It uses
operator<
by default.In fact, in general, C++ Standard Library containers use
!(a < b) && !(b < a)
to determine the property of equivalence.You can override the comparator used to perform this check by providing your own
Compare
template argument to the container type, though there is rarely a reason to — you should usually simply defineoperator<
for your type instead, as you have done. (Make sure that it creates a Strict Weak Ordering, though.)No, your set is never like this. Your set contains pointers, not
Node
s. Make it aset<Node>
instead.STL不使用
==
运算符进行比较,它默认使用<
运算符就足够了,因为a != b <=>; a。
您定义了一组指向
Node
的指针。所以你的设置不会按照你想要的方式运行。您应该定义set
。还需要注意的是,STL 使用<
进行插入和查找(即count
函数使用<
),因此您不能使用基于cost
的比较进行插入,使用基于state
的比较进行查找(您的代码是这样的!)。STL does not use
==
operator for comparison, it uses<
operator by default and it suffices, becausea != b <=> a<b or b<a
.You defined a set of pointers to
Node
. So your set does not behave the way you want. You should defineset<Node>
. and also its important to note that STL uses<
for both insertion and find (i.e.count
function uses<
), so you can not use comparison based oncost
for insertion and comparison based onstate
for finding (your code is like this!).例如,如果您看到此参考页面,您会看到有一个模板参数
比较
。您必须实现自己的比较功能。If you see for example this reference page, you see that there is a template parameter
Compare
. You have to implement your own comparison function.它不起作用,因为您声明了一系列指针,因此容器将进行比较。
您的比较方法
<
不会被使用,因为std::set
将使用指针之间的标准比较。如果两个Node
具有相同的内容但地址不同,您还会在集合中发现重复项。It doesn't work because you declared a ser of pointers so that is what the container will compare.
Your comparison method
<
is not going to be used becausestd::set
will use standard comparison between pointers. You will also find duplicates in your set if twoNode
s have the same contente but a different address.这是如何使用 std::set 来查找元素是否存在的典型示例
完整示例如下:
Thi is the typical example how you would you use
std::set
to find the element exists or notComplete example is as follows:
这是一组指针;它调用
operator==
来获取指针,而不是Node
。如果您想查看
Node::operator==
的调用,您应该使用std::set
。This is set of pointers; it calls
operator==
for pointers, not forNode
.You should use
std::set<Node>
if you want to see call ofNode::operator==
.