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

时间:2015-02-05 11:59:22

标签: c++ algorithm stl time-complexity

我有两个持有不同类型对象的STL容器(当前为矢量)。这两种类型都有一个返回标识符的方法,该标识符可用于“比较”不同类型。两个容器中的元素未被排序,并且比较两个标识符可能是“昂贵的”(例如,字符串比较)。预计两个容器具有相似的尺寸,可能<&lt;&lt;每个100个元素。

我现在想要做以下事情:

  • 案例1:如果容器A和容器B都包含标识符比较相等的元素,我想在容器A的元素上调用一个方法。
  • 案例2:如果容器B包含一个元素,其中包含A中没有相应元素的标识符,我想创建这样一个元素并将其插入到A中。
  • 案例3:如果容器A包含一个带有标识符的元素,其中B中没有包含相应的元素,我想在此元素上调用一个方法并将其从A中删除。

所以这一切之后应该举行

  • 两个容器中的元素数量应相等
  • 未修改容器B
  • 对于容器A中的每个元素,容器B中应该有一个元素,标识符比较相等,反之亦然

有一种有效的方法吗?我只能想到一个具有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);
  }
}

1 个答案:

答案 0 :(得分:1)

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

  1. 允许A' = sorted A
  2. 允许B' = sorted B
  3. b B'a的每个A' A' b = a进行排序(因为A已排序,我们可以使用二分搜索),(b, a) 。如果不存在此类元素,则向a添加新元素,否则对A'
  4. 执行操作
  5. b B'B'的每个a = b a A进行排序(因为(a, b)已排序,我们可以使用二分搜索),A 。如果不存在此类元素,则O(nlogn)中删除标记{{1}},否则会对{{1}}执行操作
  6. 从{{1}}
  7. 中删除所有标记的元素

    时间复杂度为{{1}}