天天看點

C++ 泛型

C++ 泛型

  • 頭檔案:

    algorithm

find

  • 代碼
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    
    using namespace std;
    
    
    int main()
    {
        cout << "start!" << endl;
    
        int ia[] = {10,20,30};
    
        int *res = find(ia, ia+3, 10);
        if (res == cend(ia)) //如果沒有找到,則res指向end
        {
            cout << "can not find" << endl;
        }
        else
        {
            cout << "find value : " << res-cbegin(ia) << ", " <<  *res << endl;
        }
    
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               
  • 說明
    • find的第一個參數是起始位置,第二個參數是要搜尋的末位置的後一位,第三個參數是要尋找的變量值
    • 如果找到的話,傳回值是指向容器對應位置的地方;沒有找到的話,則傳回值指向容器的end
    • 如果需要對應位置的值,直接

      *res

      ,取對應位置的内容即可。

count

  • 說明:按照

    C++ primer 5th中的10.1

    的練習寫的代碼
  • 代碼
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    
    using namespace std;
    
    
    int main()
    {
        cout << "start!" << endl;
    
        vector<int> v;
        int r;
    
        cout << "Please input vector number" << endl;
        while (cin >> r)
        {
            v.push_back( r );
        }
    
        cin.clear(); //使輸入流重新有效
    
        while (true)
        {
            cout << "please input number to find : ";
            cin >> r;
    
            int number = count( v.begin(), v.end(), r );
            cout << "find same number : " << number << endl;
        }
    
    
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               
  • 注意:在

    ctrl+z

    終止輸入後,再次輸入時,需要用

    cin.clear()

    來清空緩沖區。

accumulate

  • 在頭檔案

    numeric

  • 說明:前兩個參數是疊代器的始末位置,必須是隻讀的類型,第三個參數是累加的初始值,必須顯式建立,否則會不知道其類型。
  • 代碼
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    
    using namespace std;
    
    
    int main()
    {
        cout << "start!" << endl;
    
        vector<int> v;
        for (int i = 0; i < 10; i++)
            v.push_back(i);
        int res = accumulate(v.cbegin(), v.cend(), 0);
        cout << res << endl;
    
        vector<string> vs = {"a", "bdsg", "fdr"};
        string ress = accumulate(vs.cbegin(), vs.cend(), string(""));
        cout << ress << endl;
    
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               

fill and fill_n

  • 用于給容器的某些元素指派
  • fill是指定要填充的始末和要填充的元素
  • fill_n是指定要填充的起始位置和填充個數以及要填充的元素
  • fill_n:個數不能超過目前的容量,否則程式會報錯。
  • 代碼
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    
    using namespace std;
    
    
    int main()
    {
        cout << "start!" << endl;
        vector<string> vs = {"a", "bdsg", "fdr"};
    
        fill_n( vs.begin(), vs.size(), string("0") );
        fill(vs.begin(), vs.end(), string("23"));
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               

copy and replace and replace_copy

  • copy:複制
  • replace:替換
  • replace_copy:将源容器中的所有要進行疊代的資料複制到一個新的容器中,是以

    back_inserter

    的形式插入(在末尾添加的形式)
  • 代碼
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    
    using namespace std;
    
    
    int main()
    {
        cout << "start!" << endl;
    
        vector<int> orig;
        auto it = back_inserter( orig );
        for (int i = 0; i < 10; i++)
        {
            *it = i;
        }
        vector<int> res1( orig.size() );
        copy(orig.begin(), orig.end(), res1.begin());
        replace( orig.begin(), orig.end(), 0, 233 );
        vector<int> res2;
        replace_copy(orig.begin(), orig.end(), back_inserter(res2), 1, 455);
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               

sort and unique and erase

  • 說明:去除容器中重複的元素
  • unique接受排序後的容器清單
  • 代碼
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    
    using namespace std;
    
    
    int main()
    {
        cout << "start!" << endl;
    
        string str = "a b c d s f g s e d a s b";
        stringstream sstream(str);
        vector<string> vs;
        while (sstream >> str)
        {
            vs.push_back( str );
        }
    
        //按照 < 的運算符進行排列,最小的排在最前面
        sort( vs.begin(), vs.end() );
    
        //unique接受有序容器,傳回值指向不重複區域之後一個位置的疊代器
        auto end_unique = unique( vs.begin(), vs.end() );
    
        vs.erase( end_unique, vs.end() );
    
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               

lambda

  • 說明:除了可以接受自己的函數參數清單,還可以捕獲所在函數的局部變量,并使用在程式中
  • 代碼
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    
    using namespace std;
    
    
    int main()
    {
        cout << "start!" << endl;
    
        auto func_add_1 = [](int a, int b) {return a + b; };
    
        cout << func_add_1(3,3) << endl;
    
        int num1 = 3;
    
        auto func_add_2 = [num1](int num){ return num + num1; };
    
        cout << func_add_2(5) << endl;
    
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               
  • func_add_1

    :傳入的參數
  • func_add_2

    :捕獲清單

bind and count_if

  • count_if

    :記錄容器中滿足條件的個數,條件可以用

    lambda表達式

    給出
  • bind

    :用于修改函數的一些屬性,如傳參的順序,可以通過修改占位符來修改傳參的順序
  • 代碼
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    #include<functional>  //bind
    
    using namespace std;
    
    bool Smaller(const int &a, const int &b)
    {
        return a <= b;
    }
    
    int main()
    {
        cout << "start!" << endl;
    
        string str = "a by-value capture cannot be modified in a non-mutable lambda";
        stringstream sstream(str);
        vector<string> vs;
        while (sstream >> str)
        {
            vs.push_back(str );
        }
    
        int cnt = count_if(vs.begin(), vs.end(), [](string str) -> bool{return str.length() >= 8; });
        cout << cnt << endl;
    
        vector<int> vi = { 1, 4, 6, 8, 2, 5, 3 };
        sort(vi.begin(), vi.end(), bind<int>(Smaller, std::placeholders::_2, std::placeholders::_1));
        for_each(vi.begin(), vi.end(), [](int n){cout << n << endl; });
    
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               

inserter and front_inserter

  • inserter

    :插入元素後,疊代器的位置指向剛剛插入元素的位置
  • front_inserter

    :元素總是插入到第一個疊代器元素之前
  • 代碼
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    #include<functional>  //bind
    
    using namespace std;
    
    int main()
    {
        cout << "start!" << endl;
    
        list<int> lst = {1,2,3,4};
        list<int> lst2, lst3;
    
        copy(lst.cbegin(), lst.cend(), front_inserter(lst2));
        copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));
    
        for_each(lst2.begin(), lst2.end(), [](int num){cout << num << endl; });
        for_each(lst3.begin(), lst3.end(), [](int num){cout << num << endl; });
    
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               

istream_iterator

  • 流疊代器
  • 說明:可以從流疊代器初始化容器
    #include<iostream>
    #include<exception>
    #include<fstream>
    #include<sstream>
    #include<string>
    #include<vector>
    #include<iterator>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<concurrent_priority_queue.h>
    #include<algorithm>
    #include<numeric>
    #include<functional>  //bind
    
    using namespace std;
    
    int main()
    {
        cout << "start!" << endl;
    
        istream_iterator<int> in_iter(cin), eof;
        vector<int> vi(in_iter, eof);
    
        for_each(vi.begin(), vi.end(), [](int num){cout << num << endl; });
    
        cout << "end!" << endl;
        system("pause");
        return EXIT_SUCCESS;
    }
               

輸出容器中所有資料的兩種方法

  • for_each

    for_each(vi.begin(), vi.end(), [](int num){cout << num << endl; });
               
  • copy

    ostream_iterator<int> out_iter(cout, "\r\n" );
    copy( vi.begin(), vi.end(), out_iter );
               

繼續閱讀