c++ - 合并多个 STL 容器并删除重复元素的最佳方法?

标签 c++ stl

我有两个要合并的 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(log n),需要 N 次插入,遍历将是 O(n),给你 O(N*log n)。 另一种选择是分别在每个列表上运行 std::sort,然后使用 std::set_union 并行遍历它们。 ,它会为您删除重复项。这也将是 O(n*log n),因此如果您担心性能,则必须进行概要分析。如果不是,请选择对您来说更有意义的方法。

编辑: set_union 仅在原始列表中没有重复项时才有效,否则您将不得不使用 sortmerge唯一删除。大 O 性能仍然相同,关于分析的警告也相同。

template <typename container>
container unique_merge(container c1, container c2)
{
    std::sort(c1.begin(), c1.end());
    std::sort(c2.begin(), c2.end());
    container mergeTarget;
    std::merge(c1.begin(), c1.end(), c2.begin(), c2.end(), 
        std::insert_iterator(mergeTarget, mergeTarget.end())
    );
    std::erase(
        std::unique(mergeTarget.begin(), mergeTarget.end()), 
        mergeTarget.end()
    );

    return mergeTarget;
}

关于c++ - 合并多个 STL 容器并删除重复元素的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/281275/

相关文章:

c++ - 括号中的类型定义

C++ - 替代基类函数指针调用

c++ - 使用 STL 算法进行 vector 操作

c++ - 为什么STL中队列有front而priority queue有top?

c++ - _Get_unwrapped 的含义?

符合 C++ STL 的分配器

c++ - 假设 STL vector 存储总是连续的是否安全?

c++ - 结构 vector ,我不知道该怎么做

c++ - 在 C++ 中声明一个对象而不创建它?

c++ - std::vector::resize() 与 std::vector::reserve()