程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++的STL算法

C++的STL算法

編輯:關於C++

cpp的STL算法

什麼是stl算法

操作stl集合的一堆方法。很方便,他們就是一堆工具。

你只要熟悉stl就可以很方便的使用他們啦。

先明白算法有哪些,有什麼作用,然後熟悉一部分常用的,其他的在實踐中時候用

stl算法的分類

非變序算法

計數算法
    count,count_if
搜索算法
    search,seach_n
    find,find_if,find_end,find_first_of,adjacent_find
比較算法
    equal,mismatch,lexicographical_compare

變序算法

初始化算法
    fill,fill_n,generate,generate_n
修改算法
    for_each,transform
復制算法
    copy,copy_backward
刪除算法
    remove,reomve_if,remove_copy,remove_copy_if
    unique,unique_copy
替換算法
    replace,replace_if
排序算法
    sort,stab_sort,partial_sort

分區算法
    partion,stable_partition
可用於排序容器的算法
binary_search,lower_bound,upper_bound

stl算法的應用

計算元素的個數
查找元素
在集合中搜索元素或序列
將容器中的元素初始化為指定的值
使用for_each處理范圍內的元素
使用transtrom 對范圍進行編號
復制和刪除操作
替換值以及滿足給定條件的元素
排序,在有序集合中搜索以及刪除重復元素
將范圍分區

在有序集合中插入元素
//
//  main.cpp
//  use_stl_algorithm
//
//  Created by bikang on 16/11/1.
//  Copyright (c) 2016年 bikang. All rights reserved.
//

#include 
#include 
#include 
#include 

using namespace std;

template 
class PrintClass {
public:
    void operator()(const T& elem)const{
        cout << elem << " ";
    }
};


template 
bool isEven(const T& number) {
    return ((number%2) == 0);
}

template 
T addData(const T & v1,const T & v2) {
    return (v1+v2);
}


//在容器中計算元素個數和查找元素
void tstlalg1();
//查找序列
void tsearch();
//容器初始化fill 偏移范圍 fill_n 開始位置,個數,數值
//generate隨機初始化
void tfill();
//transform 容器的內容的變換
void ttransform();
//測試復制和刪除
//copy,copy_backward,remove,remove_if
//replace
//partition  stable_partition
void tdelCopy();

//sort binary_search unique 排序 查找 去重復
void  tsort();



int main(int argc, const char * argv[]) {
    //tstlalg1();
    //tsearch();
    //tfill();
    //ttransform();
    //tdelCopy();
    tsort();
    return 0;
}

void  tsort(){
    vector vec1;
    vec1.push_back("tom");
    vec1.push_back("tim");
    vec1.push_back("tim");
    vec1.push_back("tam");
    vec1.push_back("tam");
    vec1.push_back("kim");
    vec1.push_back("kim");
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;

    //排序
    sort(vec1.begin(), vec1.end());
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;

    //查找
    bool searchRes = binary_search(vec1.begin(), vec1.end(), "tom");
    if(searchRes){
        cout << "find ok"<());cout << endl;
    vec1.erase(ite, vec1.end());
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;


    //有序插入,優選的最前和最靠後的位置
    string lowerStr = "ad";
    ite = lower_bound(vec1.begin(), vec1.end(),lowerStr);
    vec1.insert(ite, lowerStr);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;

    string upperStr = "ss";
    ite = upper_bound(vec1.begin(), vec1.end(),upperStr);
    vec1.insert(ite, upperStr);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;


}

void tdelCopy(){

    list l1;
    for(int j =0;j<10;++j){
        l1.push_back(j);
    }
    for_each(l1.begin(), l1.end(), PrintClass());cout << endl;

    //copy
    vector vec1(l1.size() *2);
    vector::iterator ite;
    ite = copy(l1.begin(), l1.end(),vec1.begin());
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;
    copy_backward(l1.begin(), l1.end(), vec1.end());
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;

    //remove
    remove(vec1.begin(), vec1.end(), 0);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;
    //remove if

    remove_if(vec1.begin(), vec1.end(), [](int i){return i%2==0;});
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;

    //replace
    replace(vec1.begin(), vec1.end(), 1, 21);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;
    //replace if
    replace_if(vec1.begin(), vec1.end(), [](int i){return i%2==1;}, 55);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;

    //partition
    partition(l1.begin(), l1.end(),[](int i){return i%2==1;});
    for_each(l1.begin(), l1.end(), PrintClass());cout << endl;
    //stable_partition
    stable_partition(l1.begin(), l1.end(),[](int i){return i%2==1;});
    for_each(l1.begin(), l1.end(), PrintClass());cout << endl;


}

void ttransform(){

    string str1 = "this is a simple language!";
    string str1low;
    str1low.resize(str1.size());
    transform(str1.begin(), str1.end(), str1low.begin(), (int(*)(int))toupper);
    cout << str1low << endl;

    //測試加法
    vector vec1;
    for (int i =0; i<10; ++i) {
        vec1.push_back(i);
    }

    vector vec2;
    for (int i =20; i<30; ++i) {
        vec2.push_back(i);
    }

    vector res;
    res.resize(10);

    //兩個容器的內容相加
    transform(vec1.begin(), vec1.end(), vec2.begin(), res.begin(), addData);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;
    for_each(vec2.begin(), vec2.end(), PrintClass());cout << endl;
    for_each(res.begin(), res.end(), PrintClass());cout << endl;

}

void tfill(){
    cout << "tfill" << endl;
    vector vec1(3);
    fill(vec1.begin(), vec1.end(), 9);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;

    vec1.resize(6);
    fill_n(vec1.begin()+3, 3, 3);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;
    vec1.resize(10);
    generate(vec1.begin()+6, vec1.end(), rand);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;
    vec1.resize(12);
    generate_n(vec1.begin()+10, 2, rand);
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;

}

void tsearch(){
    cout << "tsearch" << endl;
    vector vec1;
    for (int i =0; i<10; ++i) {
        vec1.push_back(i);
    }
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;

    list l1;
    for(int j =3;j<5;++j){
        l1.push_back(j);
    }

    //search查找
    vector::iterator ite;
    ite = search(vec1.begin(), vec1.end(),l1.begin(), l1.end());
    if(ite != vec1.end()){
        cout << "pos=" << distance(vec1.begin(), ite);
    }else{
        cout << " search faild";
    }


}

void tstlalg1(){
    cout << "start" << endl;
    vector vec1;
    for (int i =0; i<10; ++i) {
        vec1.push_back(i);
    }
    for_each(vec1.begin(), vec1.end(), PrintClass());cout << endl;
    //查找 數據數量
    long numCount = 0;
    int find_data = 3;
    numCount = count(vec1.begin(), vec1.end(), (int)find_data);
    cout << "numCount=" <);
    cout << "npos=" <::iterator ite;
    ite = find(vec1.begin(), vec1.end(), find_data);
    if(ite != vec1.end()){
        cout << find="" ok="" ite="" pre="">
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved