C++相当于Python的差异_update?

Joh*_*åde 7 c++ python stdset

s1和s2是集合(Python集或C++ std :: set)
要将s2的元素添加到s1(set union),你可以做

Python: s1.update(s2)

C++: s1.insert(s2.begin(), s2.end());
Run Code Online (Sandbox Code Playgroud)

要从s1中删除s2的元素(设置差异),你可以这样做

Python: s1.difference_update(s2)
Run Code Online (Sandbox Code Playgroud)

这与C++相当的是什么?代码

s1.erase(s2.begin(), s2.end());
Run Code Online (Sandbox Code Playgroud)

不起作用,因为s1.erase()需要来自s1的迭代器.代码

std::set<T> s3;
std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), std::inserter(s3, s3.end());
s1.swap(s3);
Run Code Online (Sandbox Code Playgroud)

可行,但似乎过于复杂,至少与Python相比.

有更简单的方法吗?

D.S*_*ley 5

使用std::set_difference是在C++中执行此操作的惯用方法.您偶然发现了C++/STL与许多其他语言之间的主要差异(双关语).STL不直接将操作与数据结构捆绑在一起.这就是为什么std::set不实施差异例程.

基本上,算法如std::set_difference将操作结果写入另一个对象.有趣的是,该算法不要求实际上有一个或两个操作数std::set.算法的定义是:

效果:将范围[first1, last1)中不存在的范围元素复制[first2, last2)到从开始的范围result.构造范围中的元素已排序.

要求:结果范围不得与任何一个原始范围重叠.输入范围需要相同的顺序operator<.

返回:构造范围的结尾.

复杂性:最多2 * ((last1 - first1) + (last2 - first2)) - 1比较

有趣的区别是C++版本适用于任何两个排序范围.在大多数语言中,在访问集合差异算法之前,您必须强制将调用对象(左侧操作数)强制转换或转换为集合.

这与您的问题并不完全相关,但这就是各种设置算法被建模为独立算法而不是成员方法的原因.