如何在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中重复,如何删除所有出现的元素[重复]