📜  C++ STL-list.merge()函数(1)

📅  最后修改于: 2023-12-03 14:39:50.994000             🧑  作者: Mango

C++ STL-list.merge()函数

std::list是C++ STL提供的标准双向链表容器,它支持高效的插入和删除操作。std::list::merge()函数是用于将两个已排序的std::list合并的函数。在合并完成后两个列表的元素将按照其自然顺序排列。

语法:

void merge(list& x);
void merge(list&& x);
template<class Compare> void merge(list& x, Compare comp);
template<class Compare> void merge(list&& x, Compare comp);

其中,x是要合并的std::list对象或右值引用,comp是用于自定义排序规则的比较函数。

返回值为void

示例

下面是一个简单的例子,展示了如何使用std::list::merge()函数:

#include <iostream>
#include <list>

int main() {
    std::list<int> a = {1, 3, 5, 7};
    std::list<int> b = {2, 4, 6, 8};
    
    a.merge(b); // 将b合并到a中
    
    std::cout << "a:";
    for (auto n : a) {
        std::cout << " " << n;
    }
    std::cout << std::endl;
    
    return 0;
}

输出结果:

a: 1 2 3 4 5 6 7 8
自定义排序规则

除了默认的自然顺序,我们还可以使用自定义的排序规则。下面的示例将两个列表按照绝对值从小到大的顺序合并:

#include <iostream>
#include <list>
#include <cstdlib>

int abs_compare(int a, int b) {
    return std::abs(a) < std::abs(b);
}

int main() {
    std::list<int> a = {-7, -5, 1, 3};
    std::list<int> b = {-8, 2, -4, 6};
    
    a.merge(b, abs_compare);
    
    std::cout << "a:";
    for (auto n : a) {
        std::cout << " " << n;
    }
    std::cout << std::endl;
    
    return 0;
}

输出结果:

a: 1 2 3 -4 -5 -6 -7 -8
注意事项

由于std::list是一个双向链表,因此它并不支持随机访问和迭代器的加减操作,所以std::list::merge()函数的时间复杂度为线性,即$O(N)$。在合并完成后,原来的列表对象将不再可用,因为所有的节点已经被移动到了新列表中。所以,在使用std::list::merge()函数之前,请确保你真的需要合并两个列表,而不是仅仅需要复制它们的元素。