通过调用 transform 方法对齐持有不同类型的两个容器

Align two containers holding different types by calling transform methods

我有两个 STL 容器(目前是矢量),其中包含不同类型的对象。这两种类型都有一个返回标识符的方法,该标识符可用于 "compare" 不同的类型。两个容器中的元素都没有排序,比较两个标识符可能是 "expensive"(例如字符串比较)。两个容器的大小应该相似,每个容器可能包含 << 100 个元素。

我现在想做以下事情:

所以毕竟它应该持有

有没有有效的方法来做到这一点?我只能想到一个运行时复杂度为 O(2*n*m) 的算法,这听起来太多了。

std::vector<T1> containerA;
std::vector<T2> containerB;

for(auto &elementA : containerA)
{
  std::vector<T2>::iterator bIter = std::find_if(containerB.begin(), containerB.end(), [elementA](const T2 &elementB){ return (elementA.getId() == elementB.getId()); })
  if(bIter == containerB.end())
  {
    // case 3
    elementA.foo();
    // remove elementA from containerA
  }

  // case 1
  elementA.bar((*bIter));
}

for(const auto &elementB : containerB)
{
  std::vector<T1>::iterator aIter = std::find_if(containerA.begin(), containerA.end(), [elementB](const T1 &elementA){ return (elementA.getId() == elementB.getId()); })
  if(aIter == containerA.end())
  {
    // case 2
    T1 newElement(elementB);
    containerA.push_back(newElement);
  }
}

假设 A sum B 上存在总订单,您可以尝试以下操作:

  1. A'=sorted A
  2. B'=sorted B
  3. 对于 B' 中的每个 bA' 中找到 a(因为 A' 已排序,我们可以使用二进制搜索)使得 b = a.如果不存在这样的元素,则向 A 添加新元素,否则对 (b, a)
  4. 执行操作
  5. 对于 A' 中的每个 aB' 中找到 b(因为 B' 已排序,我们可以使用二进制搜索)这样 a = b.如果不存在这样的元素,则在 A 中删除标记 a 否则对 (a, b)
  6. 执行操作
  7. A
  8. 中删除所有标记的元素

时间复杂度为O(nlogn)