繁体   English   中英

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

[英]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行为? 这种用途有问题吗? 它是在标准中定义的应该是什么,还是依赖于实现?

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

我认为它依赖于实现。

从概念上讲, 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] 

从技术上讲,你不应该依赖于此。

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

不它不是。 想象一下这个简单的例子:

template<class T>
struct set {
   struct iterator { /*...*/ };
};

在这种情况下, set<int>::iterator肯定不同于set<double>::iterator

实现可以自由地将迭代器类型实现为一个自由类(因为迭代器不依赖于比较器),这似乎是主要实现中的情况,并且是允许你的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM