在列表容器上使用std::set_difference

10

我正在尝试调用set_difference函数,并将结果放在std :: list上。理论上,这可以在任何排序的容器上完成,对吗?

list<int> v;         

list<int> l1;  
list<int> l2;                   

list<int>::iterator it;

//l1 and l2 are filled here

l1.sort();
l2.sort();

it=set_difference(
   l1.begin(),
   l1.end(), 
   l2.begin(),
   l2.end(), 
   v.begin()
);

v返回为空列表。这是因为我不能在列表容器上使用它吗?


我意识到 set_difference(...) 也给我带来了问题。 - Dynelight
2个回答

14

这是因为 v.begin() 是一个空序列的开头。元素被拷贝到几乎任何地方。请使用 std::back_inserter(v) 替换它。那将给你一个迭代器,它知道如何插入到 v 中。


非常感谢。我还有一个问题:我正在使用set_difference(...),但它一直给我编译错误。修复了这个问题并添加了您的函数后,问题得到了解决。 - Dynelight

6
你需要提供一个输出迭代器来插入。尝试使用std::inserter
std::list<int> a { 
  10, 10, 10, 11, 11, 11, 12, 12, 12, 13
};
std::list<int> b {
  10
};
std::list<int> diff;
std::set_difference(a.begin(), a.end(), b.begin(), b.end(),
    std::inserter(diff, diff.begin()));

我稍后会尝试你的方法。Pete Becker 发布的那个方法确实有效。在stackoverflow上是否可以接受两个答案呢? - Dynelight
@meOnomNom 不,没关系;只是很高兴你解决了它 :-) - obataku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接