代码中遇到的新函数

用来记录平时遇到的新函数,保存在本地总是怕丢了。

unique函数:

int n,num[10001];
int pos = unique(num,num + n) - num;

unique为筛选出数组num中按照原顺序排序时前后相同的数字,排到最后去,返回的pos为操作之后最后一个不同的数字的位置
如10 10 20 20 30 20 20 10 10,
unique后为10 20 30 20 10 …..,pos为4,

int main () {
    int myints[] = {10,20,20,20,30,30,20,20,10};// 10 20 20 20 30 30 20 20 10
    std::vector<int> myvector (myints,myints+9);// using default comparison:
    std::vector<int>::iterator it;
    it = std::unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 ?  ?  ?  ?
    myvector.resize(std::distance(myvector.begin(),it) ); // 10 20 30 20 10

此函数同样适用于普通数组。在有些情况下可以替代set。

###next_permutation和prev_permutation函数:

int a[3] = {2,1,3};
do()while(next_permutation(a,a + 3);//213,231,312,32

即从当前状态对长度为3的数组进行全排列循环。prev也不多说了,反一下而已。同样适用于各种STL类。

###stricmp函数:

能把两个字符无视大小写进行比较

###fill_n函数和fill函数:
可以用来对string(不确定),vector,普通数组等填充值
vector myvector (8,10); // myvector: 10 10 10 10 10 10 10 10

fill_n (myvector.begin(),4,20);     // myvector: 20 20 20 20 10 10 10 10
fill_n (myvector.begin()+3,3,33);   // myvector: 20 20 20 33 33 33 10 10
vector<int> myvector (8);    // myvector: 0 0 0 0 0 0 0 0
fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
fill (myvector.begin()+3,myvector.end()-2,8);   // myvector: 5 5 5 8 8 8 0 0

###lower_bound和upper_bound函数:

其中如果寻找的value存在,那么lower_bound返回一个迭代器指向其中第一个这个元素。upper_bound返回一个迭代器指向其中最后一个这个元素的下一个位置(明确点说就是返回在不破坏顺序的情况下,可插入value的最后一个位置)。如果寻找的value不存在,那么lower_bound和upper_bound都返回“假设这样的元素存在时应该出现的位置”。
函数upper_bound()返回的在前闭后开区间查找的关键字的上界,如一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,同样,如果插入元素大于数组中全部元素,返回的是last。(注意:此时数组下标越界!!)
返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置
int te = upper_bound(f,f + p,s[i]) - f;最后减去数组名字才会返回下标。BTW,这两个函数都是采用二分的形式,复杂度很低,可以放心用。

热评文章