【问题标题】:How to remove duplicates elements in nested list in c++如何在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 就应该可以工作。您可能需要定义一个谓词。

标签: c++ list nested-lists


【解决方案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::endlgodbolt.org/z/To7aecYfM
  • @rturrado,我同意。你是对的。
  • @VadimChernetsov 这个解决方案对我有用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 2019-07-13
  • 2017-03-02
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
相关资源
最近更新 更多