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相比.
有更简单的方法吗?
使用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++版本适用于任何两个排序范围.在大多数语言中,在访问集合差异算法之前,您必须强制将调用对象(左侧操作数)强制转换或转换为集合.
这与您的问题并不完全相关,但这就是各种设置算法被建模为独立算法而不是成员方法的原因.