找出指向同一对象的两组指针之间的差异

find the difference between two sets of pointers to the same object

本文关键字:两组 指针 之间 对象      更新时间:2023-10-16

如何找到指向同一对象的两组指针之间的差异?

有没有一种有效的方法可以不遍历两个集合的所有对象。

我有两套:

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;
}