unique函式
這是乙個去重函式,去除相鄰元素的重複元素,由於是相鄰元素,因此使用前一般要對元素進行排序(排序可以用到sort函式)。這裡的「去除」並不是將元素刪除掉,而是後面不重複的元素向前移動,將重複元素覆蓋。例如數字:1 ,3 , 3, 4, 5,6 , 6 , 7 經過去重之後變為1,3,4,5,6,7,6,7
元素的個數並沒有改變。
函式原型:(兩個引數的情況)
iterator unique
(iterator it_1,iterator it_2)
;
返回值為乙個迭代器,指向不重複元素的下乙個元素,對於上乙個例子來說,返回指向6的迭代器(這個6是第七個數)。
可以結合vector將重複元素刪除,這裡要用到erase函式(題目超連結有dalao**hhhh)
#include
#include
#include
using
namespace std;
intmain()
; vector<
int>v;
for(
int i=
0;i) v.
push_back
(num[i]);
vector<
int>
::iterator it=v.
begin()
;sort
(it,it+n)
;//先排序
cout<<
"去重前的陣列元素為:"
<
for(
int i=
0;i<
8;i++
) cout<
<<
" ";
cout<
vector<
int>
::iterator new_it;
new_it=
unique
(it,it+8)
;//去重,返回指向6的迭代器
cout<<
"去重後的陣列元素為:"
<
for(
int i=
0;i<
8;i++
) cout<
<<
" ";
cout<
v.erase
(new_it,it+8)
; cout<<
"刪除重複元素後的陣列元素為:"
<
for(
int i=
0;isize()
;i++
) cout<
<<
" ";
cout<
}
輸出結果為:
lower_bound函式和upper_bound函式
相同點:都是通過二分查詢在乙個排好序的陣列中實現的(預設是公升序排列)
不同點:
lower_bound函式是查詢陣列中第乙個大於或等於給定值的元素,找到之後返回該元素的位址。沒找到則返回end
upper_bound函式是查詢陣列中第乙個大於給定值的元素,找到之後返回該元素的位址。沒找到返回end
( lower_bound(num,num+8,4)-num 後面減去num得到的是找到的元素的下標,因為陣列名也是指向陣列第乙個元素的指標嘛~ )
由於兩個函式都是預設公升序排列,以下**是可以的:
#include
#include
using
namespace std;
intmain()
;//公升序
cout<<
lower_bound
(num,num+8,
4)-num<
//輸出:4
cout<<
upper_bound
(num,num+8,
4)-num<
//輸出:7
cout<<
lower_bound
(num,num+8,
6)-num<
//輸出:7
cout<<
upper_bound
(num,num+8,
6)-num<
//輸出:8
cout<<
lower_bound
(num,num+8,
0)-num<
//輸出:0
cout<<
upper_bound
(num,num+8,
0)-num<
//輸出:0
}
然而如果陣列降序排列,由於兩個函式都是用二分查詢,假如在陣列中查詢4,二分查詢mid指向3,發現3小於4,則要向右半部分查詢,然而降序排列右半部分的元素肯定小於等於3,因此找不到4,只能返回end
**如下:
#include
#include
using
namespace std;
intmain()
;//降序
cout<<
lower_bound
(a,a+8,
4)-a<
//輸出:8
cout<<
upper_bound
(a,a+8,
4)-a<
//輸出:8
cout<<
lower_bound
(a,a+8,
6)-a<
//輸出:8
cout<<
upper_bound
(a,a+8,
6)-a<
//輸出:8
cout<<
lower_bound
(a,a+8,
0)-a<
//輸出:0
cout<<
upper_bound
(a,a+8,
0)-a<
//輸出:0
}
當陣列為降序的時候,也可以使用這兩個函式,需要對這兩個函式進行過載:
lower_bound
( begin,end,num,greater()
)//查詢第乙個小於等於num的元素
upper_bound
( begin,end,num,greater()
)//查詢第乙個小於num的元素
舉個例子:
#include
#include
using
namespace std;
intmain()
;//降序
cout<<
lower_bound
(a,a+8,
4,greater<
int>()
)-a<
//輸出:1
cout<<
upper_bound
(a,a+8,
4,greater<
int>()
)-a<
//輸出:4
cout<
}
STL之string函式整理
stl的string容器使用很多,常常忘記一些函式的用法,決定邊用邊整理起來。首先使用條件是include庫 string s1 abcdefg 用字串的值初始化s1 string s2 s1 拷貝建構函式生成s1的副本s2 string s3 s1,index 將s1中從index的位置後的字串作...
STL 簡單整理
stl include multisetnum 定義 multiset iterator it 迭代器 num.insert b 插入 num.erase num.find b 刪除 查詢 num.erasr pos pos位資料 num.erasr beg,end 區間刪除 num.count b...
STL 整理唱片
problem g stl 整理唱片time limit 1 sec memory limit 128 mbsubmit 6303 solved 1778 submit status description小明有乙個書架,但是他卻用它放了許多唱片。但是他的習慣很不好,唱片胡亂擺放。於是他決定整理一下...