是否可以将std :: list :: iterator放入std :: set?

时间:2016-09-09 09:52:12

标签: c++11

是否可以将list的迭代器设置为: 我编写的代码如下: 它在VS2015上失败但在g ++上运行顺利 我还尝试使用std :: hash来计算std :: list :: iterator的哈希值 但再次失败,它没有迭代器的哈希函数。 一个人可以帮忙吗?或者这是不可能的......

#include <set>
#include <list>
#include <cstring>
#include <cassert>

// like std::less
struct myless
{
    typedef std::list<int>::iterator first_argument_type;
    typedef std::list<int>::iterator second_argument_type;
    typedef bool result_type;
    bool operator()(const std::list<int>::iterator& x,const std::list<int>::iterator& y) const
    {
        return memcmp(&x, &y, sizeof(std::list<int>::iterator)) < 0; // using memcmp
    }
};

int main()
{
    std::list<int> lst = {1,2,3,4,5};
    std::set<std::list<int>::iterator,myless> test;
    auto it = lst.begin();
    test.insert(it++);
    test.insert(it++);
    assert(test.find(lst.begin()) != test.end()); // fail on vs 2015

    auto it1 = lst.end();
    auto it2 = lst.end();
    assert(memcmp(&it1,&it2,sizeof(it1)) == 0); // fail on vs 2015  

    system("pause");
    return 0;
}

2 个答案:

答案 0 :(得分:0)

是的,如果您告诉std::list<T>::iterator他们应该订购什么订单,您可以将std::set放入std::set。合理的订单可能是std::less<T>,即您排序迭代器由它们指向的值(显然你不能插入std::list::end迭代器)。任何其他订单也没关系。

但是,您尝试使用memcmp,这是错误的。 set使用的谓词要求相等的值相等,并且不能保证相等的迭代器(由list::iterator::operator==定义)也使用memcmp进行比较。

答案 1 :(得分:0)

我找到了一种方法来执行此操作,但不是最终迭代器

 bool operator<(const T& x, const T& y) 
  {
     return &*x < &*y;
  }