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 );
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

littletomatodonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值