所以我有两个不同的列表,有不同的格式和结构需要协调。本质上,SET B需要匹配集合A中的哪些内容,但我希望保持集合B中现有项的状态,而不使用集合A中的内容覆盖它们。
作为参考,列表实际上并不意味着列表“列表”有两种不同的形式,从直接数组到映射所有这些都使用标准迭代器来访问元素。
我通常的处理方式是。。。

for item in listA
  if listB contains item
     mark item in list B as visited
  else
     add item to list b

 for item in listB
   if visited is true
      continue
   else
       add item to removeList

 for item in removeList
    remove item from list B

这很管用,是我唯一能想到的办法。不过,我不喜欢有多少次迭代,让三个for循环背对背感觉不对但是,由于我使用迭代器,所以在检查列表时不能从列表中删除任何内容,而是必须将它们添加到第三个删除列表中。
在可能的答案中,请记住速度和内存占用对我来说比编写代码简单多重要。
我的问题归根结底是这样的——有没有一种更好的方法来做到这一点,我没有想到?
我在C++/C FWW,虽然我认为任何解决方案可能是语言不可知论者。
谢谢!

最佳答案

下面是另一种可能更有效的方法:

removeList = listB

for item in listA
  if listB contains item
    remove item from removeList
  else
    add item to listB

for item in removeList
  remove item from listB

因此,它不是从零开始构建removelist,而是从所有东西开始,然后从中移除项目。
您还可以通过使用removelist存储索引而不是实际的项来提高效率。只要在初始循环中将项添加到listb的末尾,并按相反的顺序删除项,索引就应该仍然有效。
事实上,如果用要保留的项的布尔数组替换removeList,则更简单所以算法变成这样:
initialise all itemsToKeep to false
savedListLength = length of listB

for item in listA
  offset = find item in listB
  if found
    mark itemsToKeep[offset] as true
  else
    add item to listB

for offset from savedListLength-1 down to 0
  if itemsToKeep[offset] is false
    remove the offset from listB

这避免了最初将任何内容复制到removelist中的需要。而且items to keep数组的开销肯定不会比您在算法中使用的跟踪可见项的开销更糟糕。
在某种程度上,最合适的算法可能取决于列表的形式(即向量或链接列表等),但我认为我的方法有可能更有效。

关于c++ - 调和两个 list ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17706564/

10-10 07:44