📌  相关文章
📜  C++ STL中的forward_list :: unique()(1)

📅  最后修改于: 2023-12-03 15:13:56.329000             🧑  作者: Mango

C++ STL 中的 forward_list::unique()

在C++ STL中,forward_list是一个单链表容器,在其前身list的基础上,通过使用单向链表来减少内存占用和提高插入删除操作的效率。forward_list提供了丰富的成员函数,其中unique()函数可以用于去除连续重复元素。

语法

以下是forward_list::unique()函数的语法:

void unique();
功能

unique()函数会将forward_list中连续重复的元素去除,只保留一个。

参数

无参数。

实现

以下是forward_list::unique()函数的简单实现过程:

void unique() {
    auto node = m_head->next;
    while (node != nullptr && node->next != nullptr) {
        if (node->data == node->next->data) {
            auto tmp = node->next;
            node->next = tmp->next;
            delete tmp;
        } else {
            node = node->next;
        }
    }
}

该函数使用了迭代器的思想,通过遍历链表并比较相邻节点的值,来判断是否需要删除重复节点。在需要删除节点时,将指向下一个节点的指针改变后再释放该节点的空间,避免了使用remove()函数的额外内存开销。值得注意的是,该函数只会删除相邻重复的元素,若要删除不相邻重复的元素,则需要使用remove()函数。

示例

以下示例展示了使用forward_list::unique()函数去除重复元素的过程:

#include <iostream>
#include <forward_list>

using namespace std;

int main() {
    forward_list<int> l = {1, 2, 2, 3, 4, 4, 4, 5};

    cout << "before unique: ";
    for (auto i : l) {
        cout << i << " ";  // 1 2 2 3 4 4 4 5 
    }

    l.unique();

    cout << "\nafter unique: ";
    for (auto i : l) {
        cout << i << " ";  // 1 2 3 4 5 
    }

    return 0;
}

在该示例中,先初始化了一个带有重复元素的forward_list,再使用unique()函数去除重复元素,并输出结果。

总结

forward_list::unique()函数提供了一种简单快捷的去除重复元素的方法,对于链表中存在许多连续重复元素的情况尤为适用。然而,其只能去除相邻节点的重复元素,若要去除不相邻节点的重复元素,则需要使用其他函数或自定义实现。