unique函数

  1. 基本介绍与头文件

    • 在C++中,unique函数主要用于去除序列(如数组、vector等容器)中相邻的重复元素。它位于<algorithm>头文件中。需要注意的是,unique函数并不会真正删除元素,而是将不重复的元素移到序列的前面,并返回一个迭代器,指向新的逻辑结束位置(即最后一个不重复元素的下一个位置)。
  2. 函数原型与参数要求

    • 函数原型为template <class ForwardIterator> ForwardIterator unique (ForwardIterator first, ForwardIterator last);
    • 其中first是指向要处理序列的起始位置的迭代器,last是指向要处理序列的结束位置(实际是最后一个元素的下一个位置)的迭代器。这意味着[first, last)这个半开区间内的元素会被处理。例如,对于一个数组int arr[] = {1, 1, 2, 2, 3, 3};,可以使用unique(arr, arr + sizeof(arr)/sizeof(arr[0]))来尝试去除相邻重复元素。
  3. 简单示例(处理数组)

    • 以下是一个使用unique函数处理整数数组的示例:
    #include <iostream>
    #include <algorithm>
    int main()
    {
        int arr[] = {1, 1, 2, 2, 3, 3};
        int n = sizeof(arr)/sizeof(arr[0]);
        auto new_end = unique(arr, arr + n);
        for (int i = 0; i < (new_end - arr); ++i)
        {
            std::cout << arr[i] << " ";
        }
        std::cout << std::endl;
        return 0;
    }
    
    • 在这个例子中,首先定义了一个整数数组arr,并计算出数组的元素个数n。然后调用unique(arr, arr + n)来处理数组,它会将不重复的元素移到数组前面。返回的迭代器new_end指向新的逻辑结束位置,通过(new_end - arr)可以计算出不重复元素的个数。最后,通过一个循环输出处理后的数组元素,可以看到输出为1 2 3
  4. 与容器结合使用示例(以vector为例)

    • unique函数与vector容器结合使用时,操作过程类似。以下是一个示例:
    #include <iostream>
    #include <algorithm>
    #include <vector>
    int main()
    {
        std::vector<int> v = {1, 1, 2, 2, 3, 3};
        auto new_end = unique(v.begin(), v.end());
        v.erase(new_end, v.end());
        for (auto i : v)
        {
            std::cout << i << " ";
        }
        std::cout << std::endl;
        return 0;
    }
    
    • 在这里,首先定义了一个vector容器v,并初始化了一些元素。然后调用unique(v.begin(), v.end())来处理vector中的元素,得到新的逻辑结束位置new_end。接着,使用v.erase(new_end, v.end())真正删除了vector中多余的重复元素。最后,通过一个范围for循环输出处理后的vector元素,同样可以看到输出为1 2 3
  5. 应用场景与注意事项

    • 应用场景
      • 在数据处理和算法问题中,unique函数常用于对序列进行初步的去重处理。例如,在统计不同元素的个数或者对数据进行预处理以便后续更高效地处理时,unique函数可以快速地将相邻重复元素合并,减少数据量。
    • 注意事项
      • 如前面所述,unique函数不会真正删除元素,所以如果想要完全删除序列中的重复元素,通常需要结合容器的erase函数(如vectorerase函数)来实现。另外,unique函数只能处理相邻的重复元素,如果序列中的重复元素不是相邻的,需要先对序列进行排序,使重复元素相邻,然后再使用unique函数。
  6. 一般情况

    • unique函数主要是去除相邻的重复元素。如果元素是无序的,它只会去除相邻的重复元素,而不会对整个序列中的所有重复元素进行处理。
    • 例如,有一个数组int arr[] = {2, 1, 2, 1, 3},在不排序的情况下使用unique函数,得到的结果是{2, 1, 2, 3}。它只是将相邻的重复元素去除了一部分,并没有将所有的重复元素都移到一起。
  7. 需要完全去重的情况

    • 如果想要完全去除序列中的所有重复元素(不只是相邻的重复元素),那么在使用unique函数之前最好对序列进行排序。
    • 例如,对于上述数组int arr[] = {2, 1, 2, 1, 3},如果先进行排序(使用sort函数)得到{1, 1, 2, 2, 3},然后再使用unique函数,就可以得到{1, 2, 3},这样就去除了所有的重复元素。
    • 以下是一个结合sortunique函数来完全去重的示例代码:
    #include <iostream>
    #include <algorithm>
    int main()
    {
        int arr[] = {2, 1, 2, 1, 3};
        int n = sizeof(arr)/sizeof(arr[0]);
        std::sort(arr, arr + n);
        auto new_end = unique(arr, arr + n);
        for (int i = 0; i < (new_end - arr); ++i)
        {
            std::cout << arr[i] << " ";
        }
        std::cout << std::endl;
        return 0;
    }
    
  8. 特殊应用场景不需要排序

    • 在某些特定的应用场景下,不需要对序列进行排序就可以直接使用unique函数。
    • 例如,在处理一个数据流或者序列,只关心相邻元素是否重复,并且希望尽可能保持原始的顺序(除了相邻重复元素被去除)。比如,在一个实时的数据监控系统中,接收一系列数据点,需要去除相邻的相同数据点来减少数据量,但又不想改变数据点的大致顺序,这种情况下就可以直接使用unique函数而不需要排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值