C++去重函数unique超详解|有序数组去重必学

张开发
2026/4/16 14:49:58 15 分钟阅读

分享文章

C++去重函数unique超详解|有序数组去重必学
C去重函数unique超详解有序数组去重必学一、函数原型二、函数说明三、函数用法3.1 普通有序数组去重3.2 vector去重unique函数可以删除有序数组中的重复元素 是 C 标准库algorithm中的函数。注意使用它的前提是有序数组就是排好序的数组。unique的意思是“独一无二的”。uni其实就是one的变形que就是汉语拼音“缺”所以它的意思就是哥们就哥儿一个缺少兄弟姐妹。一、函数原型这玩艺叫函数模板比较复杂以老金的智慧也解释不清楚大概看一眼就行了。// 默认使用 operator 比较templateclassForwardItForwardItunique(ForwardIt first,ForwardIt last);// 使用自定义二元谓词 predtemplateclassForwardIt,classBinaryPredicateForwardItunique(ForwardIt first,ForwardIt last,BinaryPredicate pred);有志于放开手脚好好研究一番的朋友观迎参观权威文档cppreference.com–std::unique只需要知道这东西就是个像PPT模板一样。它就是给咱的一套模具让咱不用管那些外壳形状之类的事情更加专注于内容。有了这个模板函数功能就会变强。强在哪里呢正常我们写一个函数都要预先指定其参数类型函数返回值。这个参数类型和函数返回值必须是具体的、明确的因此一个函数只能处理一种类型的数据返回一种类型的返回值。比如下面这个求和函数只能用来求int类型的变量的和。intadd(inta,intb){returnab;}有了函数模板就不一样了它不预先指定函数的参数类型、返回值而是随便用一串字符表示这是一个对象的类型至于是什么类型我不管。这串很随便的字符只起到“占位符”的作用通俗来讲就是占着茅坑不拉屎。等到实际调用函数的时候系统编辑器会根据你传入实际参数的数据类型把这些占位符替换掉然后再去执行。如此一来我们只需要编写一个函数就可以处理不同类型的参数输出不同类型的返回值。这就像同一个PPT模板你编辑时可以敲入任何类型的内容一样。上面的模板是C标准库为咱定制好的咱直接拿过来用即可其实咱也是可以自己写模板的。二、函数说明只移除相邻重复元素如果重复元素不相邻不会被移除。因此通常先对序列排序。不真正删除元素本质上只是移动元素即将不重复元素前移所以容器大小不变。如果要彻底删除元素需要配合容器的erase方法物理删除。返回值指向新的逻辑末尾第一个“无用”元素的位置。复杂度对于非空区间线性时间恰好( l a s t − f i r s t ) − 1 (last - first) - 1(last−first)−1次比较。三、函数用法3.1 普通有序数组去重#includeiostream#includealgorithmintmain(){intarr[]{1,1,2,2,2,3,4,4,5};intnsizeof(arr)/sizeof(arr[0]);// unique 将不重复元素移到前面返回新末尾指针int*new_endstd::unique(arr,arrn);// 输出逻辑上的去重结果for(int*parr;p!new_end;p)std::cout*p ;// 输出: 1 2 3 4 5std::coutstd::endl;// 实际数组内容后面元素未定义通常保持原样// arr 现在可能为 {1,2,3,4,5,3,4,4,5}return0;}3.2 vector去重因为vector是动态数组(就是长度可以动态调整的数组)所以去重后可以采用erase方法彻底删除重复元素。#includevector#includealgorithmstd::vectorintv{1,1,2,2,3,3,3};autoitstd::unique(v.begin(),v.end());v.erase(it,v.end());// 物理删除重复元素// v 变为 {1,2,3}有关vector的说明参见cppreference.com–std::vector

更多文章