找出指向同一对象的两组指针之间的差异
find the difference between two sets of pointers to the same object
如何找到指向同一对象的两组指针之间的差异?
有没有一种有效的方法可以不遍历两个集合的所有对象。
我有两套:
std::set<Object*>
如果对象私有成员(名称(与其他对象名称相同,则表示该对象相同。
STL的算法库非常棒,可扩展,而且未得到充分利用。
这将把集合差作为向量(我想你可以把它转换成一个集合,但没有必要,至少对于你所要求的,向量更快,因为集合已经排序了(。
template<typename T>
std::vector<T> set_diff(std::set<T> const &a, std::set<T> const &b) {
std::vector v<T>;
std::set_difference(a.begin(), a.end(), b.begin(), b.end(), v.begin());
return v;
}
可选地,放在构造函数之后
v.reserve(a.size() + b.size());
并且在返回(C++11(之前
v.shrink_to_fit();
注意:这将生成a
中不在b
中的项。要查找其中一个项目中的所有项目而不查找另一个项目,请改用std::set_symmetric_difference
。
我认为不同的意思是找到只出现在一个集合中的指针元素。最有效的方法是同步迭代两个集合,这将只花费O(n+m(时间,其中n,m表示两个集合的大小,在一般情况下,这是问题的下界。
幸运的是,STL容器集使用平衡的二进制搜索树作为基础,我们可以在线性时间内按顺序迭代所有元素,因此可以实现O(n+m(。
template<typename T>
std::vector<T> set_diff(std::set<T> const &a, std::set<T> const &b) {
std::vector<T> v;
auto ita = a.begin();
auto itb = b.begin();
while (ita != a.end() && itb != b.end()) {
if (*ita == *itb) {
++ita, ++itb;
} else if (*ita < *itb) {
v.push_back(*ita);
++ita;
} else {
v.push_back(*itb);
++itb;
}
}
for (; ita != a.end(); v.push_back(*ita), ++ita);
for (; itb != b.end(); v.push_back(*itb), ++itb);
return v;
}
相关文章:
- 两组使用lambda函数的大括号
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 已知数组/指针大小作为参数
- 这些指针的含义,指针到指针,函数指针和数组指针
- 尝试查找两组点的交集,错误"No viable overloaded '=' "
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 如何在两组上做两指针技术
- 使与同一数组无关的两个指针减去未定义行为的基本原理是什么?
- 如何加入两个指针以将其串在一起并将其存储在数组或字符中
- 代码解释 C++ [结构 / 两个 diamentinal 数组 / 指针]
- 找出指向同一对象的两组指针之间的差异
- 2d数组指针不适用于两个维度