1. 程式人生 > >25.不改變原生數據的STL algorithm

25.不改變原生數據的STL algorithm

Go 查找算法 out 第一個 nbsp each turn bcd spa

  • 通過仿函數for_each操作
    1 vector<int> myv{ 1,2,3,4,5 };
    2 list<double> db{ 1.1,2.2,3.3,4.4,5.5 };
    3 
    4 //循環算法,算法的泛型
    5 print p = for_each(db.begin(), db.end(), print());
    6 cout << p.count << endl;

  • find_if查找算法
    1 //查找算法
    2     auto it = find(myv.begin(), myv.end(), 3);
    3     cout << *it << endl;

  • find_if與lambda結合
     1 //尋找第一個偶數的位置,返回0就是找到的
     2     auto it = find_if(myv.begin(), myv.end(), [](int x)->bool 
     3     {
     4         if (x % 2 == 0)
     5         {
     6             return 0;
     7         }
     8         else
     9         {
    10             return 1;
    11         }
    12     });
    13 
    14     if (it != myv.end())
    
    15 { 16 cout << *it << " pos=" << it - myv.begin() << endl; 17 }

  • adjacent_find處理相鄰的兩個數據
    1 list <int> mylist{ 3,6,9,11,11,28,20,29 };
    2     //查找相鄰的兩個元素相等的位置(adjacent_find處理相鄰的兩個數據)
    3     auto it = adjacent_find(mylist.begin(), mylist.end());
    4     if (it != mylist.end())
    
    5 { 6 cout << *it << endl; 7 it++; 8 cout << *it << endl; 9 }

  • adjacent_find與lambda結合
     1 //尋找第一個奇偶性不同的
     2         auto it = adjacent_find(mylist.begin(), mylist.end(), [](int x,int y)->bool
     3         {
     4             if ((x - y) % 2 == 0)
     5             {
     6                 return 0;
     7             }
     8             else
     9             {
    10                 return 1;
    11             }
    12         });
    13         if (it != mylist.end())
    14         {
    15             cout << *it << endl;
    16             it++;
    17             cout << *it << endl;
    18         }

  • find_first_of尋找第一個集合在第二個集合中出現的第一個數據
     1 char *str1 = "1234567890";
     2     char *str2 = "abcdefg123";
     3     //尋找在string1中第一個出現在string2的字符
     4     char *p = find_first_of(str1, str1 + strlen(str1), str2, str2 + strlen(str2));
     5     cout << *p << endl;
     6 
     7     vector<int> myint1{ 1,2,3,4,5 };
     8     vector<int> myint2{ 7,8,9,10,1 };
     9     auto it = find_first_of(myint1.begin(), myint1.end(), myint2.begin(), myint2.end());
    10     cout << *it << endl;

  • count與count_if查詢數據個數
     1 vector<int> myint{ 1,2,3,4,5,6,1,2,3,4 };
     2     int count1 = count(myint.begin(), myint.end(), 3);
     3     cout << count1 << endl;
     4 
     5     //查詢所有小於4的元素的個數
     6     int count2 = count_if(myint.begin(), myint.end(), [](int x)
     7     {
     8         if (x < 4)
     9         {
    10             return 1;
    11         }
    12         else
    13         {
    14             return 0;
    15         }
    16     });
    17     cout << count2 << endl;

  • mismatch判斷兩個集合是否相等
     1 vector<int> myint1{ 1,2,3,4,5,6,1,2,3,4 };
     2     vector<int> myint2{ 1,2,3,4,5,6,1,2,3,4 };
     3 
     4     auto it = mismatch(myint1.begin(), myint1.end(), myint2.begin());
     5     if (it.first == myint1.end() && it.second == myint2.end())
     6     {
     7         cout << "相等" << endl;
     8     }
     9     else
    10     {
    11         //first是第一個容器不匹配的位置(可能為空),second是第二個容器不匹配的位置(可能為空)
    12         cout << "不相等" << endl;
    13         cout << *(it.first) <<"  " << *(it.second) << endl;
    14     }
     1 char *s1[] = { "abc","acv","adf","oop" };
     2     char *s2[] = { "abc","acv","adf","oop","134" };
     3     auto it = mismatch(s1, s1 + 4, s2, [](const char* str1,const char* str2)
     4     {
     5         if (strcmp(str1, str2) == 0)
     6         {
     7             return 1;
     8         }
     9         else
    10         {
    11             return 0;
    12         }
    13     });
    14 
    15     if (it.first == s1 + sizeof(s1)/sizeof(s1[0]) && it.second == s2 + sizeof(s2) / sizeof(s2[0]))
    16     {
    17         cout << "相等" << endl;
    18     }
    19     else
    20     {
    21         //first是第一個容器不匹配的位置(可能為空),second是第二個容器不匹配的位置(可能為空)
    22         cout << "不相等" << endl;
    23         //cout << *(it.first) << "  " << *(it.second) << endl;
    24     } 

  • equal判斷是否是一樣的集合
     1     
     2 
     3     vector<int> myv1{ 1,2,3,4,5 };
     4     vector<int> myv2{ -1,2,-3,4,-5 };
     5 
     6     //判斷絕對值知否相等
     7     if (equal(myv1.begin(), myv1.end(), myv2.begin(), [](int a, int b) ->bool
     8     {
     9         if (a == abs(b) || b == abs(a))
    10         {
    11             return 1;
    12         }
    13         else
    14         {
    15             return 0;
    16         }
    17     }))
    18     {
    19         cout << "相等" << endl;
    20     }
    21     else
    22     {
    23         cout << "不相等" << endl;
    24     }

  • search判斷有沒有連續一樣的部分
     1 vector<int> myv1{ 1,2 };
     2     vector<int > myv2{ 1,2,3,4,5 };
     3     
     4     //判斷有沒有連續相等的子集
     5     auto it = search(myv1.begin(), myv1.end(), myv2.begin(), myv2.end());
     6 
     7     if (it == myv1.end())
     8     {
     9         cout << "是子集" << endl;
    10     }
    11     else
    12     {
    13         cout << "不是子集" << endl;
    14     }

  • search_n判斷有沒有連續一樣的數據
     1 vector<int> myv1{ 1,2,2,2,3,3,4 };
     2     
     3     //判斷有沒有連續相等的數據
     4     auto it = search_n(myv1.begin(), myv1.end(),3, 2);
     5     
     6     if (it == myv1.end())
     7     {
     8         cout << "" << endl;
     9     }
    10     else
    11     {
    12         cout << "沒有" << endl;
    13     }

  • 從反向尋找一個集合在另一個集合中出現的位置
    1 vector<int> myv2{ 1,2,2,2,3,3,4 };
    2     vector<int> myv3{ 3,4 };
    3     //在myv2中從後往前找myv3所在的位置
    4     auto it = find_end(myv2.begin(), myv2.end(), myv3.begin(), myv3.end());
    5 
    6     if(it != myv2.end())
    7     {
    8         cout << *it << "   " << it - myv2.begin() << endl;
    9     }

25.不改變原生數據的STL algorithm