【发布时间】:2008-11-11 15:52:29
【问题描述】:
我有两个要合并的 STL 容器,删除任何出现多次的元素。例如:
typedef std::list<int> container;
container c1;
container c2;
c1.push_back(1);
c1.push_back(2);
c1.push_back(3);
c2.push_back(2);
c2.push_back(3);
c2.push_back(4);
container c3 = unique_merge(c1, c2);
// c3 now contains the following 4 elements:
// 1, 2, 3, 4
std::unique 似乎仅适用于相邻元素,在我的情况下,容器可以按任何顺序排列。我猜我可以做一些 std::set 诡计:
container unique_merge(const container& c1, const container& c2)
{
std::set<container::value_type> s;
BOOST_FOREACH(const container::value_type& val, c1)
s.insert(val);
BOOST_FOREACH(const container::value_type& val, c2)
s.insert(val);
return container(s.begin(), s.end());
}
有没有更好的方法,还是我错过了明显出血的地方?
【问题讨论】:
-
如果你要求一些“明显流血”的东西,你的实现对于大多数情况来说已经足够好了。但是确实存在更好的算法,代价是 O(N * log(M)),其中 N 是所有容器中元素的总数,M 是容器的数量。代码不小,以后有时间再写。
-
@RnMss 真的吗?您可以发布答案吗? ...
-
@user202729 天哪,那是 2014 年...
-
@user202729 现在我不确定了。我认为...,根据我写的内容判断,...也许...当时我认为每个容器都已经排序,但容器的数量可能更大(比如 1000 或更多)。