C++ STL中的forward_list merge()

C++ STL中的forward_list merge()

C++ STL的forward_list中,有一个非常有用的函数叫做merge()。这个函数可以将两个已排序的链表合并成一个。这个函数非常简单易用,但是却非常实用。

下面我们来看一下merge()函数的定义:

void merge( forward_list& other );

其中,参数other就是需要合并到当前链表中的另一个链表。

函数的作用是将两个链表合并为一个有序的链表。在merge()之前,两个链表都必须是已排序的。

下面是一个使用例子:

#include <iostream>
#include <forward_list>

int main()
{
    std::forward_list<int> first = { 1, 3, 5 };
    std::forward_list<int> second = { 2, 4, 6 };

    first.merge(second);

    for (auto i : first) std::cout << i << ' ';
    std::cout << '\n';
}

这段代码中,我们首先定义了两个已排序的链表first和second,然后调用了first的merge()函数,将second链表合并进来。

最后我们遍历打印了first链表,可以看到,链表已经按照从小到大的顺序排好了。

输出结果为:

1 2 3 4 5 6

注意,合并的两个链表在merge()函数结束后,second链表会被清空,因为被合并进来的元素都已经被移动到了first链表中。如果要保留second链表,可以将merge()的参数改为second的副本。

first.merge(second);  // 清空second链表

std::forward_list<int> second_copy = second;  // 保存second的副本
first.merge(second_copy);

除了将已排序的链表合并外,merge()函数还可以接受一个可调用对象作为第二个参数,用于指定自定义的比较函数。

#include <iostream>
#include <forward_list>
#include <cstdio>

bool compare(int a, int b)
{
    return a > b;
}

int main()
{
    std::forward_list<int> first = { 1, 3, 5 };
    std::forward_list<int> second = { 2, 4, 6 };

    first.merge(second, compare);

    for (auto i : first) std::cout << i << ' ';
    std::cout << '\n';
}

这段代码中,compare()函数返回true和false的规则与之前的例子正好相反。所以,我们使用compare()函数作为merge()的第二个参数,即可得到从大到小的有序链表。

输出结果为:

6 5 4 3 2 1

可以看到,链表已经按照从大到小的顺序排好了。

结论

merge()是forward_list的一个非常实用的函数,可以将两个已排序的链表快速合并成一个有序链表。我们只需要调用merge()函数即可,非常方便。同时,通过传递一个自定义的比较函数,我们还可以得到不同的排序结果。在使用forward_list时,不妨尝试使用merge()来简化自己的代码。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 教程