std :: set iterator具有相同的键和不同的比较器

PYA*_*PYA 7 c++ iterator set language-lawyer c++11

在试图解决一个问题,我开始思考这个-给予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;   
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否有定义的行为重新分配x到输出的insertset与相同Key,但不同的比较?这种用途有问题吗?它是在标准中定义的应该是什么,还是依赖于实现?

由于代码编译我认为两种情况下的return类型insert是相同的 - 这个假设是正确的吗?

son*_*yao 8

我认为它依赖于实现.

从概念上讲,返回类型s1.inserts2.insert不同; 特别是它们有不同的迭代器类型,即std::set<A,c_inc>::iteratorstd::set<A,c_dec>::iterator.如何std::set::iterator定义类型是实现定义的.

[set.overview]/2

using iterator               = implementation-defined; // see [container.requirements]
using const_iterator         = implementation-defined; // see [container.requirements]
Run Code Online (Sandbox Code Playgroud)

  • 查看SCARY迭代器. (2认同)