0
点赞
收藏
分享

微信扫一扫

STL中unique原理实现 及示例

vector<int>::iterator unique(vector<int>& a)
{
int t = 0;
for(int i=0; i<a.size(); i++)
if(!i || a[i]!=a[i-1])
a[t++] = a[i];
return a.begin()+t;
}


int main()
{
...
a.erase(unique(a),a.end());
...

}

去重后,数组会有如下特点:

除了首位元素,其余元素和各自的前一位不相等

因此,我们只需要把满足这个特点的所有数依次排列即可,最终返回的地址为这些数中最后一个数之后的地址,再把后面的元素删除即可

恰好碰见一道练习题可以用到


题目描述

小Z的体型实在是太胖了,每次和小D一起出门都跟不上小D的脚步,这让小Z很气馁,于是小Z跋山涉水,仿名山,遍古迹,终于找到了逍遥派。掌门看小Z求师虔诚,决定传小Z一套《凌波微步》。
这种腿法可以无视距离的行进,但缺点是只能走向高处,否则强行发功极易走火入魔。
一天,练习《林波微步》的小Z来到一处练武场,这里从左到右,共有n个木桩,这些木桩有高有低,在这里小Z勤奋的练习着凌波微步,你知道小Z在这处练武场最多能练习多少次么?

输入描述:


本题有T组数据。 对于每组数据第一行有一个正整数n表示有多少个木桩。 第二行有n个数 a_i,表示木桩与水平地面的相对高度。 1≤T≤10 1≤n≤100000 1≤a_i≤1000000000

输出描述:


输出结果,并换行。

示例1

输入


2 6 1 2 3 4 5 6 5 1 3 5 3 6

输出


6 4

说明


第一组: 1->2->3->4->5->6 共6步 第二组: 1->3->5->6 共4步

思路:

重复的高度不会跳第二次, 该题仅要求我们输出跳的次数(若是需要输出路线的话可能会用到哈希或者背包),我们只需要得出集合中各自相异的元素个数即可

正好顺便用一下刚学到的unique函数

注意:

去重前记得先排好序,因为我们的unique函数默认元素是一个呈单调 增/减 的序列

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

vector<int>::iterator unique(vector<int>& a)
{
int t = 0;
for(int i=0; i<a.size(); i++)
if(!i || a[i]!=a[i-1])
a[t++] = a[i];
return a.begin()+t;
}

int main()
{
int t,n,x;
cin >> t;
while(t--)
{
cin >> n;
vector<int> a;
for(int i=0; i<n; i++){
cin >> x;
a.push_back(x);
}
sort(a.begin(),a.end());//★
a.erase(unique(a),a.end());//去重
// for(auto item : a) cout<<item<<' ';
// cout<<endl;
cout << a.size() << endl;
}
return 0;
}


举报

相关推荐

0 条评论