是否可以将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;
}
答案 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;
}