STL泛型算法

1、std::string::size_type  len = in.length()   size_type与实际机器匹配的抽象意义尺寸单位,为unsigned类型。

2、find_first_not_of()  在母串中找到第一个不匹配任意子串的位置。Find_first_of()查找第一个匹配到子串的字符位置。一般情况下,字符分割,可以采用,先find_first_not_of()找到第一个不是子串的下标,判断是否为std::string::npos,然后find_first_of找到第一个子串的下标,判断是否为std::string::npos,最后使用substr(不是子串的下标,是子串下标-1)进行分割。

3、accumulate可以用于数值累加,字符串拼接等操作。

Vector<int> veNum (vector中存放很多数据)    int sum=accumulate(veNum.begin(), veNum.end(), 0) 从0开始累加整个vector,输出所有元素之和。

Vector<string> veStr     string endStr = accumulate(veStr.begin(), veStr.end(), std::string(“”)) 拼接vector中的所有string类型数据。

4、adjacent_find()函数,找到容器当中的相邻元素的特定属性,异常牛逼。

bool parity(int x, int y)

{   return (x - y) % 2 == 0 ? true : false;    }

int main(){

    int ar[10] = { 1,2,4,5,6,6,6,7,8 };

    std::vector<int> veNum(ar, ar+10);

    vector<int>::iterator it = veNum.begin();

    it = adjacent_find(veNum.begin(), veNum.end(), parity);

    while (it != veNum.end())

        cout << *it++ << " ";

    cout << endl;

}  //上边代码传递函数进入,找到奇偶性相同的第一个元素。打印结果:2,4,5,6,6,6,7,8,0

//如果不传递parity进入,默认查找两个相邻元素,那结果:6,6,6,7,8,0

5、binary_search 二分查找 bool end = binary_search(ve.begin(),ve.end(),value)

6、copy拷贝函数,参数为,拷贝的开始,拷贝的结束,拷贝到某个开始位置

Copy函数用于输出vector        copy(veNum.begin(), veNum.end(), ostream_iterator<int>(cout, " "));需要加头文件 algorithm和iterator

7、copy_backward()反向拷贝

8、count查找某个值出现的次数。参数为初始迭代器,结束迭代器,查找的值

9、count_if查找符合某个条件的值出现的次数。参数为初始迭代器,结束迭代器,条件。其中条件是一个函数对象,即定义一个函数,然后传递参数为函数名。

10、fill将某个数值value拷贝给容器的指定位置。三个参数为,开始位置迭代器,结束位置迭代器,待拷贝的值。

    Fill_n将某个数值value拷贝给容器指定位置开始的指定个数。三个参数为,开始位置迭代器,拷贝的个数,待拷贝的值。

11、find在容器中查找对应元素。参数,迭代器开始位置,迭代器结束为止,查找的值,找到返回找到的第一个元素的迭代器,找不到返回末尾的下一个位置。

int ar[] = { 1,2,3,4,5,6,7,8 };

    int *it = find(&ar[0], &ar[8], 11);

    cout << it << endl;

    cout << &ar[sizeof(ar) / sizeof(int)] << endl;

    if (it == &ar[sizeof(ar) / sizeof(int)])

        cout << "not " << endl;

    else

        cout << *it << endl;

find_if三个参数,迭代器开始位置,迭代器结束为止,查找条件。找到符合条件的第一个元素。

Find_end在第一个迭代器中找到第二个迭代器范围的最后一串数据。四个参数,母串迭代器起始位置,母串迭代器结束位置,子串迭代器起始位置,子串迭代器结束位置。返回母串中最后一个子串。

int ar[] = { 1,2,3,4,5,6,2,3,4,7,8 };

    int br[] = { 2,3,4 };

    std::vector<int> stStr(ar, ar + sizeof(ar) / sizeof(int));

    std::vector<int> stValue(br, br+sizeof(br)/sizeof(int));

    std::vector<int>::iterator it = find_end(stStr.begin(), stStr.end(), stValue.begin(), stValue.end());

    while (it != stStr.end())

        cout << *it++ << endl;

find_first_of在母串中找到包含子串的一个字符即可。四个参数,母串迭代器起始位置,母串迭代器结束位置,子串迭代器起始位置,子串迭代器结束位置。

12、includes查询第一个迭代器中是否包含第二个迭代器中的元素。四个参数,母迭代器起始位置,母迭代器结束位置,子迭代器起始位置,子迭代器结束位置。注意,在使用该函数之前,两个容器都必须先进行排序。而且必须进行排序,否则可能造成程序崩溃。

13、iter_swap()交换两个迭代器指向的值。两个参数,待换变量。

14、lower_bound()返回容器中第一个大于等于传入值的值。三个参数,迭代器起始位置,结束位置,待查找的值。

15、max_element()返回容器中值最大的元素。两个参数,迭代器起始位置,结束位置。

16、min_element()返回容器中值最小的元素。两个参数,迭代器起始位置,结束位置。

17、merge()合并函数,要求两个容器必须有序。五个参数,第一个容器起始位置,结束位置,第二个容器起始位置,结束位置,合并到的容器的起始位置。需要保证第三个容器有足够的空间。

18、mismatch()并行比较,找到第一个不匹配元素的位置。返回的结果是一对迭代器。找不到返回last。

Pair<std::vector<int>::iterator, std::vector<int>::iterator> end = mismatch(ve1.begin(), ve1.end(), ve2.begin());要求两个比较的容器大小相等。

19、next_permutation()全排列函数。Int ar[] = {1,2,3};   do{ cout<<ar[0]<<ar[1]<<ar[2]<<endl;}while(next_permutation(ar, ar+sizeof(ar)/sizeof(ar[0]);

20、nth_element()快排的一次划分。三个参数,起始位置,划分因子位置,结束位置。注意,划分因子需要是容器中的一个元素。

21、partial_sum()返回一个新容器,新容器每一个位置等于原先位置及之前所有元素之和。

int ar[] = { 1,2,3,4,5,6,7,8,9 };

    int len = sizeof(ar) / sizeof(ar[0]);

    std::vector<int> veNum(len);

    partial_sum(ar, ar + len, veNum.begin());

    copy(veNum.begin(), veNum.end(), ostream_iterator<int>(cout, " "));

22、random_shuffle()将容器中的元素随机打乱位置。两个参数,迭代器起始位置和结束位置。

23、remove()删除元素,但是并非真正意义的删除,元素的删除只能依靠容器自身。三个参数,容器起始位置,结束位置,待删除的值。Remove_copy()不删除原容器中的数据,新容器中存放删除成功的元素。四个参数,原容器起始位置,结束位置,空容器起始位置,待删除元素的值。Remove_if()根据定义的函数,决定是否删除该元素。三个参数,原容器起始位置,结束位置,判断函数名。Remove_copy_if(),参照remove_copy。四个参数,原容器起始位置,结束位置,空容器起始位置,判断函数名。

//remove() remove_copy() remove_if() remove_copy_if()

bool IsFive(int x) { return x == 5; }

int main()

{

    //remove()

    int ar[] = { 1,2,5,3,4,5,5,6,7,8,5,9 };

    int len = sizeof(ar) / sizeof(ar[0]);

    std::vector<int> veNum(ar, ar + len);

    copy(veNum.begin(), veNum.end(), ostream_iterator<int>(cout, " "));

    cout << endl;

    /*

    std::vector<int>::iterator it = remove(veNum.begin(), veNum.end(), 5);

    if (it != veNum.end())

        veNum.erase(it, veNum.end());

    copy(veNum.begin(), veNum.end(), ostream_iterator<int>(cout, " "));

   

    //remove_copy()

    int br[10];

    remove_copy(veNum.begin(), veNum.end(), br, 5);

    copy(veNum.begin(), veNum.end(), ostream_iterator<int>(cout, " "));

    cout << endl;

    copy(br, br+10, ostream_iterator<int>(cout, " "));

    */

    //remove_if() 根据传递的函数的返回值true/false,确认是否删除

    std::vector<int>::iterator it = remove_if(veNum.begin(), veNum.end(), IsFive);

    if (it != veNum.end())

        veNum.erase(it, veNum.end());

    copy(veNum.begin(), veNum.end(), ostream_iterator<int>(cout, " "));

}

24、replace()替换值。将原容器中全部的某个值用新数值替换。四个参数,容器起始位置,结束位置,旧值,新值。Replace_copy()替换值。原容器中全部的某个值用新数值替换。不改变原容器中的值,五个参数,旧容器起始位置,结束位置,新容器起始位置,旧值,新值。Replace_if(),满足某个判断函数的值,用新值替换。四个参数,原始容器起始位置,结束位置,判断函数名,新值。Replace_copy_if()满足某个判断函数的值,拷贝到新容器中。五个参数,旧容器起始位置,结束位置,新容器起始位置,判断函数名,新值。具体方法参照remove系列函数。

25、reverse()逆序函数。两个参数,容器起始位置,结束位置。Reverse_copy()逆序函数。三个参数,旧容器起始位置,结束位置,新容器起始位置。

26、rotate()“平移”操作。将某个位置之后的元素排列到容器的起始位置。三个参数,容器起始位置,middle中间位置,反转结束位置。

std::string strTest = "1234567890";

    rotate(strTest.begin(), strTest.begin() + 5, strTest.begin()+7);

    cout << strTest << endl;  //6701234589

同理,rotate_copy()将反转结果放入新容器,四个参数,最后多加一个新容器起始位置。

27、search()查找算法。四个参数,母容器迭代器起始位置,结束位置,子容器迭代器起始位置,结束位置。Find_end()查找最后一个子串,感觉应该叫search_end()。

28、set_difference()两个排序的序列,只存在第一个容器不存在第二个容器的元素。五个参数,一号容器起始位置,结束位置,二号位置起始位置,结束位置,三号容器。Set_intersection()两个排序序列中找同时存在的元素,参数参照前一个。Set_symmetric_difference()两个排过序的容器,找到第一个容器存在第二个不存在,或者第二个中存在第一个不存在的值,放入新容器。参数参照之前。Set_union()找到两个排序容器中元素的并集,参数参照之前。

29、partition()、table_partition(),将某些字符提前。三个参数,容器起始位置,结束位置,判断函数。两个算法的区别在于,第一个不在意被移动元素的相对位置,而第二个在意元素相对位置。

Bool Fun(char c) { return c == ‘*’; }

String str = “****b**a**c**d**”;   string str1(str);   string str2(str);

Std::partition(str1.begin(), str1.end(), Fun); //*********cdab;

Std::stable_partition(str2.begin(), str2.end(), Fun); //********bacd;

30、sort()排序,两个参数,容器起始位置,结束位置。Table_sort()也是排序方法,但是如果有多个值相同,那么他们前后的相对位置不会改变。

31、unique()去重方法。去掉连续重复的字符。两个参数,容器起始位置,结束位置。但是并不能删除最后多余出来的数据,需要使用迭代器接收其返回回来的迭代器,删除之后的数据。Unique_copy()多传递一个容器,保存去重之后的数据。

32、upper_bound()返回指向有序序列的最后一个可插入位置的迭代器。三个参数,容器起始位置,结束位置,待比较的值。

 

猜你喜欢

转载自blog.csdn.net/zhanglu_1024/article/details/81349282