日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用STL离散化处理数据(unique)

發(fā)布時間:2024/9/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用STL离散化处理数据(unique) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0x00 使用說明

離散化可以很好的減小空間復雜的度, 它適用于數(shù)據(jù)中有大量重復的值(或則數(shù)據(jù)之間跨度特別大), 使用時可以只需要其中一個。 下面的離散化處理只是對于有大量重復值的情況。

先數(shù)據(jù)存入容器對象vector<int> vec,
保證使用unique前 數(shù)據(jù)是有序的。

1. 先使用sort排序:

sort(vec.begin(),vec.end());

2. 使用unique離散化:

此時unique離散化處理并不是將重復的元素刪去,
而是將后面不重復的數(shù)來覆蓋重復了的數(shù),
可以看下面代碼的運行結果(或者參考:cppreference),
unique返回值為目標序列最后一個需要的值的地址(或迭代器對象),
可以減去首地址轉化一下

int cnt = unique(vec.begin(),vec.end())-vec.begin();

3. 刪除不需要部分

vec.erase(vec.begin()+cnt,vec.end());

0x01 測試代碼

#include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int a[8] = {1,5,3,2,3,2,7,90};sort(a,a+8);vector<int>vec(a,a+8);cout<<"使用unique前:"<<endl;for(int i = 0; i < vec.size(); i++){cout<<vec[i]<<" ";}cout<<endl;/*使用unique前需要保證數(shù)據(jù)是有序的,unique返回的是不重復序列最后的地址(迭代器形式),unique只是將重復的元素的位置用后面與它不同的元素來覆蓋*/int cnt = unique(vec.begin(),vec.end())-vec.begin();cout<<"目標序列長度:"<<cnt<<endl;cout<<"使用unique后:"<<endl;for(int i = 0; i < vec.size(); i++){cout<<vec[i]<<" ";}cout<<endl;cout<<"使用erase后:"<<endl;vec.erase(vec.begin()+cnt,vec.end());for(int i = 0; i < vec.size(); i++){cout<<vec[i]<<" ";}cout<<endl;return 0; }

總結

以上是生活随笔為你收集整理的利用STL离散化处理数据(unique)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。