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

Posted

技术标签:

【中文标题】通过调用变换方法对齐两个持有不同类型的容器【英文标题】:Align two containers holding different types by calling transform methods 【发布时间】:2015-02-05 11:59:21 【问题描述】:

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

我现在想做以下事情:

案例 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】:

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

    A' = sorted AB' = sorted B 对于B' 中的每个b,从A' 中找到a(因为A' 已排序,我们可以使用二分查找)使得b = a。如果不存在这样的元素,则向A 添加新元素,否则对(b, a) 执行操作 对于A' 中的每个a,从B' 中找到b(因为B' 已排序,我们可以使用二分查找)使得a = b。如果不存在这样的元素,则在 A 中删除标记 a,否则对 (a, b) 执行操作 从A 中删除所有标记的元素

时间复杂度为O(nlogn)

【讨论】:

我认为预先对两个范围进行排序可能会导致性能问题,但这可能属于过早优化...我会接受你的回答 @sigy 我真的不同意这一点。我认为一开始就选择好的算法并不是“过早的优化”。尤其是在不需要太多努力的情况下。 我同意这一点!我的意思是认为排序可能太慢,因为没有测试是否真的是问题的字符串比较是过早优化。它自己的算法没有考虑排序的成本。

以上是关于通过调用变换方法对齐两个持有不同类型的容器的主要内容,如果未能解决你的问题,请参考以下文章

java持有对象ArrayList容器续解

方法重载

读书笔记——持有对象

C++ sizeof与strlen,并借此明晰内存对齐

网格映射

Spring 面试题