[英]Comparators in std::map, std::set and std::priority_queue
[英]std::set iterator with same key and different comparators
在尝试解决问题时,我开始考虑这个问题 - 给定一个user-defined class
和2个comparators
,假设我们有2组std::set<user_class,comparator_inc>
和std::set<user_class,comparator_dec>
其中comparators
通过增加和减少user_class
的值(也许是一个简单的int
)来排序。 这是我的代码:
#include <iostream>
#include <set>
using std::cout;
using std::endl;
using std::set;
struct A
{
int val;
};
struct c_inc
{
bool operator()(const A& first,const A& second) const
{
return first.val > second.val;
}
};
struct c_dec
{
bool operator()(const A& first,const A& second) const
{
return first.val < second.val;
}
};
int main()
{
set<A,c_inc> s1;
set<A,c_dec> s2;
auto x = s1.insert({1});
cout << x.first->val << endl;
x = s2.insert({1});
x = s2.insert({0});
cout << x.first->val << endl;
}
我的问题是:是否定义了将x
重新分配给insert
输出到具有相同Key
但不同比较器的set
行为? 这种用途有问题吗? 它是在标准中定义的应该是什么,还是依赖于实现?
由于代码编译我认为两种情况下insert
的return
类型是相同的 - 这个假设是正确的吗?
我认为它依赖于实现。
从概念上讲, s1.insert
和s2.insert
的返回类型是不同的; 特别是它们有不同的迭代器类型,即std::set<A,c_inc>::iterator
和std::set<A,c_dec>::iterator
。 如何定义std::set::iterator
的类型是实现定义的。
using iterator = implementation-defined; // see [container.requirements] using const_iterator = implementation-defined; // see [container.requirements]
从技术上讲,你不应该依赖于此。
由于代码编译我认为两种情况下插入的返回类型是相同的 - 这个假设是正确的吗?
不它不是。 想象一下这个简单的例子:
template<class T>
struct set {
struct iterator { /*...*/ };
};
在这种情况下, set<int>::iterator
肯定不同于set<double>::iterator
。
实现可以自由地将迭代器类型实现为一个自由类(因为迭代器不依赖于比较器),这似乎是主要实现中的情况,并且是允许你的例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.