如何在c ++中删除嵌套列表中的重复元素

Posted

技术标签:

【中文标题】如何在c ++中删除嵌套列表中的重复元素【英文标题】:How to remove duplicates elements in nested list in c++ 【发布时间】:2022-01-15 03:24:32 【问题描述】:

我正在尝试用 C++ 解决一个 np 完全问题。我可以用 Python 解决这个问题,但运行时间相对较慢,所以这就是我改用 C++ 的原因。在问题的一部分中,我需要清除列表中的重复元素。

我有一个列表,其类型是 c++ 中的 list >。我的列表包含重复的元素,例如:

如果我发送下面的列表作为输入:

[ [1,2,3] , [2,3,4] , [2,3,4] , [4,5,6] ]

我应该得到[ [1,2,3] , [2,3,4] , [4,5,6] ] 作为该方法的结果。

那么,如何让我的嵌套列表只包含唯一元素? c++中是否有任何有效的方法或内置函数而不是使用嵌套循环?

【问题讨论】:

这不就是std::unique吗? std:unique 不起作用,因为这是嵌套列表。 只要外部列表已排序,unique 就应该可以工作。您可能需要定义一个谓词。 【参考方案1】:

std::unique 工作得很好:(input 是您的嵌套列表)

auto it = std::unique(begin(input), end(input));
input.erase(it, end(input));

【讨论】:

我试过了,但它并没有消除任何元素。 @wheneverr 对列表进行排序。 我的列表按照帖子中的示例进行排序。 @wheneverr 为我工作:gcc.godbolt.org/z/v4rbfEY8d【参考方案2】:

我知道这个解决方案不合理,但我提出使用set<list<int>>

#include <iostream>
#include <list>
#include <set>
using namespace std;
template<class Type>
void showContentContainer(Type& input)

    for(auto itemSet : input)
    
        for(auto iteratorList=itemSet.begin(); iteratorList!=itemSet.end(); ++iteratorList)
        
            cout<<*iteratorList<<", ";
        
        cout<<endl;
    
    return;

void solve()

    list<list<int>> listOfLists=1, 2, 3, 2, 3, 4, 2, 3, 4, 4, 5, 6;
    set<list<int>> setOfLists;
    for(auto iterator=listOfLists.begin(); iterator!=listOfLists.end(); ++iterator)
    
        setOfLists.insert(*iterator);
    
    cout<<"Before, listOfLists <- "<<endl;
    showContentContainer(listOfLists);
    listOfLists.clear();
    for(auto item : setOfLists)
    
        listOfLists.push_back(item);
    
    cout<<endl<<"After, listOfLists <- "<<endl;
    showContentContainer(listOfLists);
    cout<<endl;
    return;

int main()

    solve();
    return 0;

结果如下:

Before, listOfLists <- 
1, 2, 3, 
2, 3, 4, 
2, 3, 4, 
4, 5, 6, 

After, listOfLists <- 
1, 2, 3, 
2, 3, 4, 
4, 5, 6, 

【讨论】:

不像unique 解决方案那样优雅和简单,但是在这里使用集合是很合乎逻辑的。您的解决方案中只有两个 cmets:1)您可以在 showContentContainer 中为您的内部循环使用另一个基于范围的 for 循环; 2)您可以从另一个容器的开始和结束迭代器创建一个容器:godbolt.org/z/zj6ehbEP9 也许我应该说:3)尽量不要use namespace std;,4)更喜欢\n而不是std::endl:godbolt.org/z/To7aecYfM @rturrado,我同意。你是对的。 @VadimChernetsov 这个解决方案对我有用。谢谢!

以上是关于如何在c ++中删除嵌套列表中的重复元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 或 C++ 中以 O(n) 删除数组中的重复元素?

如何从字典中的列表中删除元素[重复]

如果元素在arraylist中重复,如何删除所有出现的元素[重复]

如何删除已经在list中的重复项

C#WPF如何在由数据模板中的对象列表组成的列表框中设置项目[重复]

如何在 Python 的 for 循环中删除列表元素? [复制]