zoukankan      html  css  js  c++  java
  • C++算法接口使用参考

    C++算法接口参考

    算法参考:【algorithm

    编译:g++ -std=c++11 xxx_algorithm.cpp

    运行:./a.out

    1.保持原序列运算

    all_of

    template <class InputIterator, class UnaryPredicate>
    bool all_of(InputIterator first, InputIterator last, UnaryPredicate pred)
    {
        while (first != last)
        {
            if (!pred(*first))
            {
                return false;
            }
            ++first;
        }
    
        return true;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::all_of
    #include <array>     // std::array
    
    int main()
    {
        std::array<int, 8> foo = {3,5,7,9,11,13,15,17};
    
        if (std::all_of(foo.begin(), foo.end(), [](int i){return i%2;}))
        {
            std::cout << "All the elements are odd numbers.
    ";
        }
    
        return 0;
    }
    
    //-----Output-----
    //All the elements are odd numbers.

    any_of

    template<class InputIterator, class UnaryPredicate>
    bool any_of(InputIterator first, InputIterator last, UnaryPredicate pred)
    {
        while (first != last)
        {
            if (pred(*first))
            {
                return true;
            }
            ++first;
        }
    
        return false;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::any_of
    #include <array>     // std::array
    
    int main()
    {
        std::array<int ,7> foo = {5,3,1,0,-1,-3,-5};
    
        if (std::any_of(foo.begin(), foo.end(), [](int i){return i<0;}))
        {
            std::cout << "There are negative elements in the range.
    ";
        }
    
        return 0;
    }
    
    //-----Output-----
    //There are negative elements in the range.

    none_of

    template<class InputIterator, class UnaryPredicate>
    bool none_of(InputIterator first, InputIterator last, UnaryPredicate pred)
    {
        while (first != last)
        {
            if (pred(*first))
            {
                return false;
            }
            ++first;
        }
    
        return true;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::none_of
    #include <array>     // std::array
    
    int main()
    {
        std::array<int, 8> foo = {1,2,3,4,5,6,7,8};
    
        if ( std::none_of(foo.begin(), foo.end(), [](int i){return i<0;}) )
        {
            std::cout << "There are no negative elements in the range.
    ";
        }
    
        return 0;
    }
    
    //-----Output-----
    //There are no negative elements in the range.

    for_each

    template<class InputIterator, class Function>
    Function forEach(InputIterator first, InputIterator last, Function fn)
    {
        while (first != last)
        {
            fn(*first);
            ++first;
        }
    
        //return move(fn);
        return fn;       // or, since c++11: return move(fn);
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::for_each
    #include <vector>    // std::vector
    
    void myfunction(int i)
    {
        std::cout << ' ' << i;
    }
    
    struct myclass
    {
        void operator() (int i) {std::cout << ' ' << i;}
    }myobject;
    
    int main()
    {
        std::vector<int> myvector;
        myvector.push_back(10);
        myvector.push_back(20);
        myvector.push_back(30);
    
        std::cout << "myvector contains:";
        forEach (myvector.begin(), myvector.end(), myfunction);
        std::cout << '
    ';
    
        // or:
        std::cout << "myvector contains:";
        forEach(myvector.begin(), myvector.end(), myobject);
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector: 10 20 30
    //myvector: 10 20 30

    find

    template<class InputIterator, class T>
    InputIterator Find(InputIterator first, InputIterator last, const T& val)
    {
        while (first != last)
        {
            if (*first == val)
            {
                return first;
            }
            ++first;
        }
    
        return last;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::find
    #include <vector>    // std::vector
    
    int main()
    {
        // using std::find with array and pointer:
        int myints[] = {10, 20, 30, 40};
        int *p;
    
        //p = std::find(myints, myints+4, 30);
        p = Find(myints, myints+4, 30);
        if (p != myints+4)
        {
            std::cout << "Element found in myints:" << *p << '
    ';
        }
        else
        {
            std::cout << "Element not found in myints.
    ";
        }
    
        // using std::find with vector and iterator:
        std::vector<int> myvector(myints, myints+4);
        std::vector<int>::iterator it;
    
        //it = find(myvector.begin(), myvector.end(), 30);
        it = Find(myvector.begin(), myvector.end(), 30);
        if (it != myvector.end())
        {
            std::cout << "Element found in myvector:" << *it << '
    ';
        }
        else
        {
            std::cout << "Element not found in myvector.
    ";
        }
    
        return 0;
    }
    
    //-----Output-----
    //Element found in myints:30
    //Element found in myvector:30

     find_if

    template<class InputIterator, class UnaryPredicate>
    InputIterator find_if(InputIterator first, InputIterator last, UnaryPredicate pred)
    {
        while (first != last)
        {
            if (pred(*first))
            {
                return first;
            }
            ++first;
        }
    
        return last;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::find_if
    #include <vector>    // std::vector
    
    bool IsOdd(int i)
    {
        return ((i%2)==1);
    }
    
    int main ()
    {
        std::vector<int> myvector;
    
        myvector.push_back(10);
        myvector.push_back(25);
        myvector.push_back(40);
        myvector.push_back(55);
    
        std::vector<int>::iterator it = std::find_if(myvector.begin(), myvector.end(), IsOdd);
        std::cout << "The first odd value is:" << *it << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //The first odd value is:25

    find_if_not

    template<class InputIterator, class UnaryPredicate>
    InputIterator find_if_not(InputIterator first, InputIterator last, UnaryPredicate pred)
    {
        while (first != last)
        {
            if (!pred(*first))
            {
                return first;
            }
        }
    
        return last;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::find_if_not
    #include <array>     // std::array
    
    int main()
    {
        std::array<int, 5> foo = {1,2,3,4,5};
    
        std::array<int, 5>::iterator it = std::find_if_not(foo.begin(), foo.end(), [](int i){return i%2;});
        std::cout << "The first even value is:" << *it << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //The first even value is:2

    find_end

    template <class ForwardIterator1, class ForwardIterator2>
    ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator2 last1,
                              ForwardIterator2 first2, ForwardIterator2 last2)
    {
        if (first2 == last2)
        {
            return last1;
        }
    
        ForwardIterator1 ret = last1;
    
        while (first1 != last1)
        {
            ForwardIterator1 it1 = first1;
            ForwardIterator2 it2 = first2;
            while (*it1 == *it2)
            {
                ++it1;
                ++it2;
                
                if (it2 == last2)
                {
                    ret = first1; 
                    break;
                }
    
                if (it1 == last1)
                {
                    return ret;
                }
            }
    
            ++first1;
        }
    
        return ret;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::find_end
    #include <vector>    // std::vector
    
    bool myfunction(int i, int j)
    {
        return (i==j);
    }
    
    int main()
    {
        int myints[] = {1,2,3,4,5,1,2,3,4,5};
        std::vector<int> haystack(myints, myints+10);
    
        int needle1[] = {1,2,3};
        // using default comparison:
        std::vector<int>::iterator it;
        it = std::find_end(haystack.begin(), haystack.end(), needle1, needle1+3);
    
        if (it != haystack.end())
        {
            std::cout << "needle1 last found at position:" << (it-haystack.begin()) << '
    ';
        }
    
        int needle2[] = {4,5,1};
        // using predicate comparison:
        it = std::find_end(haystack.begin(), haystack.end(), needle2, needle2+3, myfunction);
        
        if (it != haystack.end())
        {
            std::cout << "needle2 last found at position:" << (it-haystack.begin()) << '
    ';
        }
    
        return 0;
    }
    
    //-----Output-----
    //needle1 found at position:5
    //needle2 found at position:3

    find_first_of

    template<class InputIterator, class ForwardIterator>
    InputIterator findFirstOf(InputIterator first1, InputIterator last1,
            ForwardIterator first2, ForwardIterator last2)
    {
        while (first1 != last1)
        {
            for (ForwardIterator it=first2; it!=last2; ++it)
            {
                if (*it == *first1)
                {
                    return first1;
                }
                ++first1;
            }
        }
    
        return last1;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::find_first_of
    #include <vector>    // std::vector
    #include <cctype>    // std::tolower
    
    bool comp_case_insensitive(char c1, char c2)
    {
        return (std::tolower(c1) == std::tolower(c2));
    }
    
    int main()
    {
        int mychars[] = {'a', 'b', 'c', 'A', 'B', 'C'};
        std::vector<char> haystack(mychars, mychars+6);
        std::vector<char>::iterator it;
    
        int needle[] = {'A', 'B', 'C'};
        // using default comparison:
        it = findFirstOf(haystack.begin(), haystack.end(), needle, needle+3);
        if (it != haystack.end())
        {
            std::cout << "The first match is:" << *it << '
    ';
        }
    
        // using predicate comparison:
        //it = findFirstOf(haystack.begin(), haystack.end(), needle, needle+3, comp_case_insensitive);
        //if (it != haystack.end())
        //{
        //    std::cout << "The first match is:" << *it << '
    ';
        //}
    
        return 0;
    }
    
    //-----Output-----
    //The first match is:A
    //The first match is:a

    adjacent_find

    template<class ForwardIterator>
    ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last)
    {
        if (first != last)
        {
            ForwardIterator next = first;
            ++next;
            while (next != last)
            {
                if (*first == next)
                {
                    return first;
                }
                ++first;
                ++next;
            }
        }
    
        return last;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::adjacent_find
    #include <vector>    // std::vector
    
    int main()
    {
        int myints[] = {5,20,5,30,30,20,10,10,20};
        std::vector<int> myvector(myints, myints+8);
        std::vector<int>::iterator it;
    
        // using default comparison:
        it = std::adjacent_find(myvector.begin(), myvector.end());
        if (it != myvector.end())
        {
            std::cout << "The first pair of repeated elements are:" << *it << '
    ';
        }
    
        return 0;
    }
    
    //-----Output-----
    //The first pair of repeated elements are:30

    count

    template <class InputIterator, class T>
    int count(InputIterator first, InputIterator last, const T& val)
    {
        int ret = 0;
        while (first != last)
        {
            if (*first == val)
            {
                ++ret;
            }
            ++first;
        }
    
        return ret;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::count
    #include <vector>    // std::vector
    
    int main()
    {
        // counting elements in array:
        int myints[] = {10,20,30,30,20,10,10,40}; // 8 elements
        int mycount = std::count(myints, myints+8, 10);
        std::cout << "10 appears " << mycount << " times.
    ";
    
        // counting elements in container:
        std::vector<int> myvector(myints, myints+8);
        mycount = std::count(myvector.begin(), myvector.end(), 20);
        std::cout << "20 appears " << mycount << " times.
    ";
    
        return 0;
    }
    
    //-----Output-----
    //10 appears 3 times.
    //20 appears 2 times.

    count_if

    template<class InputIterator, class UnaryPredicate>
    int countIf(InputIterator first, InputIterator last, UnaryPredicate pred)
    {
        int ret = 0;
        while (first != last)
        {
            if (pred(*first))
            {
                ++ret;
            }
            ++first;
        }
    
        return ret;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::count_if
    #include <vector>    // std::vector
    
    bool IsOdd(int i)
    {
        return ((i%2) == 1);
    }
    
    int main()
    {
        std::vector<int> myvector;
        for (int i=1; i<10; i++)
        {
            myvector.push_back(i);
        }
    
        int mycount = countIf(myvector.begin(), myvector.end(), IsOdd);
        std::cout << "myvector contains " << mycount << " odd values.
    ";
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains 5 odd values.

    mismatch

    #include <utility>  // std::pair
    template<class InputIterator1, class InputIterator2>
    std::pair<InputIterator1, InputIterator2>
    mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
    {
        while ((first1 != last1) && (first1 == first2))
        {
            ++first1;
            ++first2;
        }
    
        return std::make_pair(first1, first2);
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::mismatch
    #include <vector>    // std::vector
    
    bool mypredicate(int i, int j)
    {
        return (i==j);
    }
    
    int main()
    {
        std::vector<int> myvector;  // 10 20 30 40 50
        for (int i=1; i<6; i++)
        {
            myvector.push_back(i*10);
        }
    
        int myints[] = {10, 20, 80, 320, 1024};
    
        std::pair<std::vector<int>::iterator, int*> mypair;
        // using defautl comparison:
        mypair = std::mismatch(myvector.begin(), myvector.end(), myints);
        std::cout << "First mismatching elements:" << *mypair.first;
        std::cout << " and " << *mypair.second << '
    ';
    
        ++mypair.first;
        ++mypair.second;
        // using predicate comparison:
        mypair = std::mismatch(mypair.first, myvector.end(), mypair.second, mypredicate);
        std::cout << "Second mismatching elements:" << *mypair.first;
        std::cout << " and " << *mypair.second << '
    ';
    
        return 0;
    }
    
    //------Output------
    //First mismatching elements:30 and 80
    //Second mismatching elements:40 and 320

    equal

    template<class InputIterator1, class InputIterator2>
    bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
    {
        while (first1 != last1)
        {
            if (first1 != first2)
            {
                return false;
            }
            ++first1;
            ++first2;
        }
    
        return true;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::equal
    #include <vector>    // std::vector
    
    bool mypredicate(int i, int j)
    {
        return (i==j);
    }
    
    int main()
    {
        int myints[] = {20,40,60, 80, 100};
        std::vector<int> myvector(myints, myints+5);
    
        // using default comparison:
        if (std::equal(myvector.begin(), myvector.end(), myints))
        {
            std::cout << "The contents of both sequences are equal.
    ";
        }
        else
        {
            std::cout << "The contents of both sequences differ.
    ";
        }
    
        myvector[3] = 81;
        // using predicate comparison:
        if (std::equal(myvector.begin(), myvector.end(), myints, mypredicate))
        {
            std::cout << "Second contents of both sequences are equal.
    ";
        }
        else
        {
            std::cout << "Second contents of both sequences differ.
    ";
        }
    
        return 0;
    }
    
    //-----Putput-----
    //The contents of both sequences are equal.
    //Second contents of both sequence differ.

    is_permutation

    #include <iostream>  // std::cout
    
    template <class InputIterator1, class InputIterator2>
    bool is_permutation(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
    {
        std::tie(first1, first2) = std::mismatch(first1, last1, first2);
        if (first1 == last1)
        {
            return true;
        }
    
        InputIterator2 last2 = first2;
        std::advance(last2, std::distance(first1, last1));
        for (InputIterator1 it1=first1; it1!=last1; ++it1)
        {
            if (std::find(first1, it1, *it1) == it1)
            {
                auto n = std::count(first2, last2, *it1);
                if (n==0 || std::count(it1, last1, *it1)!=n)
                {
                    return false;
                }
            }
        }
    }
    
    //-----Example-----
    #include <algorithm> // std::is_permutation
    #include <array>     // std::array
    
    int main()
    {
        std::array<int, 5> foo = {1,2,3,4,5};
        std::array<int, 5> bar = {3,1,4,5,2};
    
        if (std::is_permutation(foo.begin(), foo.end(), bar.begin()))
        {
            std::cout << "foo and bar contain the same elements.
    ";
        }
    
        return 0;
    }
    
    //------Output-----
    //foo and bar contain the same elements.

    search

    template<class ForwardIterator1, class ForwardIterator2>
    ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
            ForwardIterator2 first2, ForwardIterator2 last2)
    {
        if (first2 == last2)
        {
            return first1;
        }    
    
        while (first1 != last1)
        {
            ForwardIterator1 it1 = first1;
            ForwardIterator2 it2 = first2;
            while(*it1 == *it2)
            {
                ++it1;
                ++it2;
                if (it2 == last2)
                {
                    return first1;
                }
    
                if (it1 == last1)
                {
                    return last1;
                }
            }
            ++first1;
        }
    
        return first1;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::search
    #include <vector>    // std::vector
    
    bool mypredicate(int i, int j)
    {
        return (i==j);
    }
    
    int main()
    {
        std::vector<int> haystack;    // 10 20 30 40 50 60 70 80 90
        for (int i=1; i<10; ++i)
        {
            haystack.push_back(i*10);
        }
    
        // using default comparison:
        int needle1[] = {40, 50, 60, 70};
        std::vector<int>::iterator it;
        it = std::search(haystack.begin(), haystack.end(), needle1, needle1+4);
        if (it != haystack.end())
        {
            std::cout << "needle1 found at position:" << (it-haystack.begin()) << '
    ';
        }
        else
        {
            std::cout << "needle1 not found.
    ";
        }
    
        // using predicate comparison:
        int needle2[] = {20, 30, 50};
        it  = std::search(haystack.begin(), haystack.end(), needle2, needle2+3, mypredicate);
        if (it != haystack.end())
        {
            std::cout << "needle2 found at position:" << (it-haystack.begin()) << '
    ';
        }
        else
        {
            std::cout << "needle2 not found.
    ";
        }
    
        return 0;
    }
    
    //-----Output-----
    //needle1 found at position:3
    //needle2 not found.

    search_n

    #include <iostream>  // std::cout
    
    template <class ForwardIterator, class Size, class T>
    ForwardIterator search_n(ForwardIterator first, ForwardIterator last,
            Size count, const T& val)
    {
        ForwardIterator it, limit;
        Size i;
    
        limit = first;
        std::advance(limit, std::distance(first, last)-count);
        while (first != limit)
        {
            it = first;
            i  = 0;
            while (*it == val)
            {
                ++it;
                if (++i == count)
                {
                    return first;
                }
            }
            ++first;
        }
    
        return last;
    }
    
    //-----Example-----
    #include <algorithm> // std::searcn_n
    #include <vector>    // std::vector
    
    bool mypredicate(int i, int j)
    {
        return (i==j);
    }
    
    int main()
    {
        int myints[] = {10,20,30,30,20,10,10,20};
        std::vector<int> myvector(myints, myints+8);
    
        std::vector<int>::iterator it;
        // using default comparison:
        it = std::search_n(myvector.begin(), myvector.end(), 2, 30);
        if (it != myvector.end())
        {
            std::cout << "Two 30s found at position:" << (it-myvector.begin()) << '
    ';
        }
        else
        {
            std::cout << "Match1 not found.
    ";
        }
    
        // using predicate comparison:
        it = std::search_n(myvector.begin(), myvector.end(), 2, 10, mypredicate);
        if (it != myvector.end())
        {
            std::cout << "Two 10s found at position:" << (it-myvector.begin()) << '
    ';
        }
        else
        {
            std::cout << "Match2 not found.
    ";
        }
    
        return 0;
    }
    
    //-----Output-----
    //Two 30s found at position:2
    //Two 10s found at position:5

    2.更改原序列运算

    copy

    template<class InputIterator, class OutputInterator>
    OutputInterator copy(InputIterator first, InputIterator last, OutputInterator result)
    {
        while (first != last)
        {
            *result = *last;
            ++result;
            ++first;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::copy
    #include <vector>    // std::vector
    
    int main()
    {
        int myints[] = {10,20,30,40,50,60,70};
        std::vector<int> myvector(7);
    
        std::copy(myints, myints+7, myvector.begin());
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 10 20 30 40 50 60 70

    copy_n

    template<class InputIterator, class Size, class OutputIterator>
    OutputIterator copy_n(InputIterator first, Size n, OutputIterator result)
    {
        while (n > 0)
        {
            *result = *first;
            ++result;
            ++first;
            --n;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::copy_n
    #include <vector>    // std::vector
    
    int main()
    {
        int myints[] = {10,20,30,40,50,60,70};
        
        std::vector<int> myvector;
        myvector.resize(7);
        std::copy_n(myints, 7, myvector.begin());
    
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output----
    //myvector contains: 10 20 30 40 50 60 70

    copy_if

    template<class InputIterator, class OutputIterator, class UnaryPredicate>
    OutputIterator copy_if(InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred)
    {
        while (first != last)
        {
            if (pred(*first))
            {
                *result = *first;
                ++result;
            }
            ++first;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::copy_if
    #include <vector>    // std::vector
    
    int main()
    {
        std::vector<int> foo = {5, -10, -5, 0, 15};
        std::vector<int> bar(foo.size());
    
        // copy only positive numbers:
        auto it = std::copy_if(foo.begin(), foo.end(), bar.begin(), [](int i){return (i>0);});
        bar.resize(std::distance(bar.begin(), it));  // shrink container to new size
    
        std::cout << "bar contains:";
        for (int &x: bar)
        {
            std::cout << ' ' << x;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //bat contains: 5 15

     copy_backward

    template<class InputIterator, class OutputIterator>
    OutputIterator copy_backward(InputIterator first, InputIterator last, OutputIterator result)
    {
        while (last != first)
        {
            *(--result) = *(--last);
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::copy_backward
    #include <vector>    // std::vector
    
    int main()
    {
        std::vector<int> myvector;
        // set some values: 10 20 30 40 50
        for (int i=1; i<=5; ++i)
        {
            myvector.push_back(i*10);
        }
    
        std::vector<int> bar;
        bar.resize(myvector.size());
        std::copy_backward(myvector.begin(), myvector.end(), bar.end());
    
        std::cout << "bar contains:";
        for (std::vector<int>::iterator it=bar.begin(); it!=bar.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //bar contains: 10 20 30 40 50

    move

    #include <iostream>  // std::cout
    #include <algorithm> // std::move(range)
    #include <utility>   // std::move(object)
    #include <vector>    // std::vector
    #include <string>    // std::string
    
    template<class InputIterator, class OutputIterator>
    OutputIterator move(InputIterator first, InputIterator last, OutputIterator result)
    {
        while (first != last)
        {
            *result = std::move(*first);
            ++result;
            ++first;
        }
    
        return result;
    }
    
    //-----Example-----
    int main()
    {
        std::vector<std::string> foo = {"Hello", "World"};
        std::vector<std::string> bar(2);
    
        // moving ranges:
        std::cout << "Moving ranges...
    ";
        std::move(foo.begin(), foo.end(), bar.begin());
    
        std::cout << "foo contains " << foo.size() << " elements:";
        std::cout << "(each in an unspecified but valid state)";
        std::cout << '
    ';
    
        std::cout << "bar contains " << bar.size() << " elements:";
        for (std::string &x:bar)
        {
            std::cout << " [" << x << "]";
        }
        std::cout << '
    ';
    
        // moving containers:
        std::cout << "Moving containers...
    ";
        foo = std::move(bar);
    
        std::cout << "foo contains " << foo.size() << " elements:";
        for (std::string &x:foo)
        {
            std::cout << " [" << x << "]";
        }
        std::cout << '
    ';
    
        std::cout << "bar is in an unspecified but valid state";
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //Moving ranges...
    //foo contains 2 elements:(each in an unspecified but valid state)
    //bar contains 2 elements: [Hello] [World]
    //Moving contains...
    //foo contains 2 elements: [Hello] [World]
    //bar is in an unspecified but valid state

    move_backward

    #include <iostream>  // std::cout
    #include <algorithm> // std::move_backward
    #include <vector>    // std::vector
    #include <string>    // std::string
    
    template<class InputIterator, class OutputIterator>
    OutputIterator move_backward(InputIterator first, InputIterator last, OutputIterator result)
    {
        while (last != first)
        {
            *(--result) == *(--last);
        }
    
        return result;
    }
    
    //-----Example-----
    int main()
    {
        std::string elems[2] = {"Hello", "World"};
        std::vector<std::string> bar(4);
    
        // insert new elements at the beginning:
        std::move_backward(elems, elems+2, bar.end());
        bar[0] = "Welcome";
        bar[1] = "To";
        
        std::cout << "bar contains:";
        for (std::string &x:bar)
        {
            std::cout << " [" << x << "]";
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //bar contains: [Welcome] [To] [Hello] [World]

    swap

    template<class T> void swap(T &a, T &b)
    {
        T c(a);
        a = b;
        b = c;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::swap
    #include <vector>    // std::vector
    
    int main()
    {
        int x = 10;
        int y = 20;
        std::swap(x, y);
        std::cout << "Swap x and y:
    ";
        std::cout << "x=" << x << "; y=" << y;
        std::cout << '
    ';
    
        std::vector<int> foo(3,x);
        std::vector<int> bar(2,y);
        std::swap(foo, bar);
        std::cout << "Swap contains:
    ";
        std::cout << "foo contains:";
        for (std::vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
        std::cout << "bar contains:";
        for (std::vector<int>::iterator it=bar.begin(); it!=bar.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //Swap x and y:
    //x=20; y=10
    //Swap contains:
    //foo contains:10 10
    //bar contains:20 20 20

    swap_ranges

    #include <iostream>  // std::cout
    #include <algorithm> // std::swap_ranges
    #include <vector>    // std::vector
        
    template<class ForwardIterator1, class ForwardIterator2>
    ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2)
    {
        while (first1 != last1)
        {
            std::swap(*first1, *first2);
            ++first1;
            ++first2;
        }
    
        return first2;
    }
    
    //-----Example-----
    int main()
    {
        std::vector<int> foo(5, 11); // 11 11 11 11 11
        std::vector<int> bar(5, 22); // 22 22 22 22 22
    
        std::swap_ranges(foo.begin()+1, foo.end()-1, bar.begin()+1);
        std::cout << "foo contains:";
        for (std::vector<int>::iterator it=foo.begin(); it!=foo.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        std::cout << "bar contains:";
        for (std::vector<int>::iterator it=bar.begin(); it!=bar.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //foo contains: 11 22 22 22 11
    //bar contains: 22 11 11 11 22

    iter_swap

    #include <iostream>  // std::cout
    #include <algorithm> // std::iter_swap
    #include <vector>    // std::vector
        
    template<class ForwardIterator1, class ForwardIterator2>
    void iter_swap(ForwardIterator1 a, ForwardIterator2 b)
    {
        std::swap(*a, *b);
    }
    
    //-----Example-----
    int main()
    {
        int myints[] = {10,20,30,40,50};                //   myints: 10 20 30 40 50
        std::vector<int> myvector(4,99);                // myvector: 99 99 99 99
    
        std::iter_swap(myints, myvector.begin());       //   myints: 99 20 30 40 50
                                                        // myvector: 10 99 99 99
        std::iter_swap(myints+2, myvector.begin()+3);   //   myints: 99 20 99 40 50
                                                        // myvector: 10 99 99 30
        std::cout << "myints contains:";
        for (int i=0; i<5; i++)
        {
            std::cout << ' ' << myints[i];
        }
        std::cout << '
    ';
    
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myints contains: 99 20 99 40 50
    //myvector contains: 10 99 99 30

    transform

    template<class InputIterator, class OutputIterator, class UnaryOperator>
    OutputIterator transform(InputIterator first, InputIterator last, 
            OutputIterator result, UnaryOperator op)
    {
        while (first != last)
        {
            *result = op(*first);
            ++result;
            ++first;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>   // std::cout
    #include <algorithm>  // std::transform
    #include <vector>     // std::vector
    #include <functional> // std::plus
    
    int op_increase (int i)
    {
        return (++i);
    }
    
    int main()
    {
        std::vector<int> foo;
        std::vector<int> bar;
    
        // set some value:10 20 30 40 50
        for (int i=1; i<=5; i++)
        {
            foo.push_back(i*10);
        }
        bar.resize(foo.size());
    
        std::transform(foo.begin(), foo.end(), bar.begin(), op_increase);
        std::cout << "increase foo:";
        for (std::vector<int>::iterator it=bar.begin(); it!=bar.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        std::transform(foo.begin(), foo.end(), bar.begin(), bar.begin(), std::plus<int>());
        std::cout << "plus foo and bar:";
        for (std::vector<int>::iterator it= bar.begin(); it!=bar.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //icrease foo: 11 21 31 41 51
    //plus foo and bar: 21 41 61 81 101

    replace

    template<class ForwardIterator, class T>
    void replace(ForwardIterator first, ForwardIterator last,
            const T& old_value, const T& new_value)
    {
        while (first != last)
        {
            if (*first == old_value)
            {
                *first = new_value;
            }
            ++first;
        }
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::replace
    #include <vector>    // std::vector
    
    int main()
    {
        int myints[] = {10, 20, 30, 20, 10};
        std::vector<int> myvector(myints, myints+5);
    
        std::cout << "old myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        std::replace(myvector.begin(), myvector.end(), 20, 66);
        std::cout << "new myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //old myvector contains: 10 20 30 20 10
    //new myvector contains: 10 66 30 66 10

    replace_if

    template<class ForwardIterator, class UnaryPredicate, class T>
    void replace_if(ForwardIterator first, ForwardIterator last,
            UnaryPredicate pred, const T& new_value)
    {
        while (first != last)
        {
            if (pred(*first))
            {
                *first = new_value;
            }
            ++first;        
        }
    }
    
    //-----Excample-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::replace_if
    #include <vector>    // std::vector
    
    bool IsOdd(int i)
    {
        return ((i%2) == 1);
    }
    
    int main()
    {
        std::vector<int> myvector; // 1 2 3 4 5
        for (int i=1; i<6; i++)
        {
            myvector.push_back(i);
        }
    
        std::replace_if(myvector.begin(), myvector.end(), IsOdd, 0);
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Example-----
    //myvector contains: 0 2 0 4 0

    replace_copy

    template<class InputIterator, class OutputIterator, class T>
    OutputIterator replace_copy(InputIterator first, InputIterator last,
            OutputIterator result, const T& old_value, const T& new_value)
    {
        while (first != last)
        {
            *result = (*first==old_value)?new_value:*first;
            ++first;
            ++result;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::replace_copy
    #include <vector>    // std::vector
    
    int main()
    {
        int myints[] = {10,20,20,30,40,20};
        std::vector<int> myvector(6);
        std::replace_copy(myints, myints+6, myvector.begin(), 20, 66);
    
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 10 66 66 30 40 66

    replace_copy_if

    template<class InputIterator, class OutputIterator, class UnaryPredicate, class T>
    OutputIterator replace_copy_if(InputIterator first, InputIterator last,
            OutputIterator result, UnaryPredicate pred,
            const T& new_value)
    {
        while (first != last)
        {
            *result = (pred(*first))?new_value:*first;
            ++result;
            ++first;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::replace_copy_if
    #include <vector>    // std::vector
    
    bool IsOdd(int i)
    {
        return ((i%2)==1);
    }
    
    int main()
    {
        std::vector<int> foo, bar;
        for (int i=1; i<10; ++i)
        {
            foo.push_back(i);
        }
    
        bar.resize(foo.size());
        std::replace_copy_if(foo.begin(), foo.end(), bar.begin(), IsOdd, 0);
    
        std::cout << "bar contains:";
        for (std::vector<int>::iterator it=bar.begin(); it!=bar.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //bar contains: 0 2 0 4 0 6 0 8 0

    fill

    template<class InputIterator, class T>
    void fill(InputIterator first, InputIterator last, const T& val)
    {
        while (first != last)
        {
            *first = val;
            ++first;
        }
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::fill
    #include <vector>    // std::vector
    
    int main()
    {
        std::vector<int> myvector(8);
    
        std::fill(myvector.begin(), myvector.begin()+2, 1);
        std::fill(myvector.begin()+2, myvector.begin()+4, 2);
        std::fill(myvector.begin()+4, myvector.end(), 3);
    
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 1 1 2 2 3 3 3 3

    fill_n

    template<class OutputIterator, class Size, class T>
    OutputIterator fill_n(OutputIterator first, Size n, const T& val)
    {
        while (n > 0)
        {
            *first = val;
            ++first;
            --n;
        }
    
        return first;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::fill_n
    #include <vector>    // std::vector
    
    int main()
    {
        std::vector<int> myvector(8, 10);
    
        std::fill_n(myvector.begin(), 2, 20);
        std::fill_n(myvector.begin()+3, 3, 30);
        
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 20 20 10 30 30 30 10 10

    generate

    template<class ForwardIterator, class Generator>
    void generate(ForwardIterator first, ForwardIterator last, Generator gen)
    {
        while (first != last)
        {
            *first = gen();
            ++first;
        }
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::generate
    #include <vector>    // std::vector
    #include <ctime>     // std::time
    #include <cstdlib>   // std::rand, std::srand
    
    // function generator:
    int RandomNumber()
    {
        return (std::rand()%100);
    }
    
    // class generator:
    struct c_unique{
        int current;
        c_unique(){current=0;}
        int operator()(){return ++current;}
    }UniqueNumber;
    
    int main()
    {
        std::srand (unsigned(std::time(0)));
        std::vector<int> myvector(8);
    
        std::generate(myvector.begin(), myvector.end(), RandomNumber);
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        std::generate(myvector.begin(), myvector.end(), UniqueNumber);
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 57 87 76 66 85 54 17 15
    //myvector contains: 1 2 3 4 5 6 7 8

     generate_n

    template<class OutputIterator, class Size, class Generator>
    void generate_n(OutputIterator first, Size n, Generator gen)
    {
        while (n > 0)
        {
            *first = gen();
            ++first;
            --n;
        }
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::generate_n
    
    int current = 0;
    int UniqueNumber()
    {
        return ++current;
    }
    
    int main()
    {
        int myints[9];
        std::generate_n(myints, 9, UniqueNumber);
    
        std::cout << "myints contains:";
        for (int i=0; i<9; ++i)
        {
            std::cout << ' ' << myints[i];
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myints contains: 1 2 3 4 5 6 7 8 9

    remove

    template<class ForwardIterator, class T>
    ForwardIterator Remove(ForwardIterator first, ForwardIterator last, const T& val)
    {
        ForwardIterator result = first;
        while (first != last)
        {
            if (!(*first == val))
            {
                *result = *first;
                ++result;
            }
            ++first;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::remove
    
    int main()
    {
        int myints[] = {10,20,30,40,50,40,30,20,10};
    
        int *pBegin  = myints;
        int *pEnd    = myints+sizeof(myints)/sizeof(int);
    
        pEnd = Remove(pBegin, pEnd, 20);
        std::cout << "rang contains:";
        for (int *p=pBegin; p!=pEnd; ++p)
        {
            std::cout << ' ' << *p;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //rang contains: 10 30 40 50 40 30 10

    remove_copy

    template<class InputIterator, class OutputIterator, class T>
    OutputIterator remove_copy(InputIterator first, InputIterator last,
            OutputIterator result, const T& val)
    {
        while (first != last)
        {
            if (!(*first == val))
            {
                *result = *first;
                ++result;
            }
            ++first;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::remove_copy
    #include <vector>    // std::vector
    
    int main()
    {
        int myints[] = {10, 20, 30, 40, 30, 20, 10};
        std::vector<int> myvector(7);
    
        std::remove_copy(myints, myints+7, myvector.begin(), 30);
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //muvector contains: 10 20 40 20 10 0 0

    remove_copy_if

    template<class InputIterator, class OutputIterator, class UnaryPredicate>
    OutputIterator remove_copy_if(InputIterator first, InputIterator last,
            OutputIterator result, UnaryPredicate pred)
    {
        while (first != last)
        {
            if (!pred(*first))
            {
                *result = *first;
                ++result;
            }
            ++first;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::remove_copy_if
    #include <vector>    // std::vector
    
    bool IsOdd(int i)
    {
        return ((i%2)==1);
    }
    
    int main()
    {
        int myints[] = {1,2,3,4,5,6,7,8,9};
        std::vector<int> myvector(9);
    
        std::remove_copy_if(myints, myints+9, myvector.begin(), IsOdd);
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 2 4 6 8 0 0 0 0 0

    unique

    template<class ForwardIterator>
    ForwardIterator unique(ForwardIterator first, ForwardIterator last)
    {
        if (first == last)
        {
            return last;
        }
    
        ForwardIterator result = last;
        while (++first != last)
        {
            if (!(*result != last))
            {
                *(++result) = *first;
            }
        }
    
        return ++result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::unique
    #include <vector>    // std::vector
    
    bool myfunction(int i, int j)
    {
        return (i == j);
    }
    
    int main()
    {
        int myints[] = {10,20,20,30,40,40,30,30};
    
        std::vector<int> myvector(myints,myints+8);
        // using default comparition:
        std::vector<int>::iterator it;
        it = std::unique(myvector.begin(), myvector.end());
        myvector.resize(std::distance(myvector.begin(),it));
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        std::vector<int> yvector(myints,myints+8);
        // using predicate comparison:
        std::unique(yvector.begin(), yvector.end(), myfunction);
        std::cout << "yvector contains:";
        for (std::vector<int>::iterator it=yvector.begin(); it!=yvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 10 20 30 40 30
    //yvector contains: 10 20 30 40 30 40 30 30

    unique_copy

    #include <iostream>  // std::cout
    #include <algorithm> // std::unique_copy, std::sort, std::distance
    #include <vector>    // std::vector
        
    template<class InputIterator, class OutputIterator>
    OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result)
    {
        if (first == last)
        {
            return result;
        }
    
        *result = *first;
        while (++first != last)
        {
            typename std::iterator_traits<InputIterator>::value_type val = *first;
            if (!(*result == val))
            {
                *(++result) = val;
            }
        }
    
        return ++result;
    }
    
    //-----Example-----
    bool myfunction(int i, int j)
    {
        return (i==j);
    }
    
    int main()
    {
        int myints[] = {10,20,20,20,30,30,20,20,10};
        std::vector<int> myvector(9);
    
        // using default comparison:
        std::vector<int>::iterator it;
        it = std::unique_copy(myints, myints+9, myvector.begin());
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator i=myvector.begin(); i!=myvector.end(); ++i)
        {
            std::cout << ' ' << *i;
        }
        std::cout << '
    ';
    
        std::sort(myvector.begin(), it);
        std::cout << "sort myvector contains:";
        for (std::vector<int>::iterator i=myvector.begin(); i!=myvector.end(); ++i)
        {
            std::cout << ' ' << *i;
        }
        std::cout << '
    ';
    
        // using predicate comparison:
        it = std::unique_copy(myvector.begin(), it, myvector.begin(), myfunction);
        myvector.resize(std::distance(myvector.begin(), it));
        std::cout << "predicate myvector contains:";
        for (std::vector<int>::iterator i=myvector.begin(); i!=myvector.end(); ++i)
        {
            std::cout << ' ' << *i;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 10 20 30 20 10 0 0 0 0
    //sort myvector contains: 10 10 20 20 30 0 0 0 0
    //predicate myvector contains: 10 20 30

    reverse

    #include <iostream>  // std::cout
    #include <algorithm> // std::reverse
    #include <vector>    // std::vector
        
    template<class InputIterator>
    void reverse(InputIterator first, InputIterator last)
    {
        while ((first != last) && (first != --last))
        {
            std::iter_swap(first, last);
            ++first;
        }
    }
    
    //-----Example-----
    int main()
    {
        std::vector<int> myvector;
        for (int i=1; i<10; i++)
        {
            myvector.push_back(i);
        }
    
        std::reverse(myvector.begin(), myvector.end());
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains:9 8 7 6 5 4 3 2 1

    reverse_copy

    template<class InputIterator, class OutputIterator>
    OutputIterator reverse_copy(InputIterator first, InputIterator last, OutputIterator result)
    {
        while (first != last)
        {
            --last;
            *result = *last;
            ++result;
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::reverse_copy
    #include <vector>    // std::vector
    
    int main()
    {
        int myints[] = {1,2,3,4,5,6,7,8,9};
        std::vector<int> myvector;
        myvector.resize(9);
    
        std::reverse_copy(myints, myints+9, myvector.begin());
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 9 8 7 6 5 4 3 2 1

     rotate

    #include <iostream>  // std::cout
    #include <algorithm> // std::rotate
    #include <vector>    // std::vector
        
    template<class ForwardIterator>
    void rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last)
    {
        ForwardIterator next = middle;
        while (first != next)
        {
            swap(*first++, *next++);
            if (next == last)
            {
                next = middle;
            }
            else if (first == middle)
            {
                middle = next;
            }
        }
    }
    
    //-----Example-----
    int main()
    {
        std::vector<int> myvector;
        for (int i=1; i<10; ++i)
        {
            myvector.push_back(i);
        }
    
        std::rotate(myvector.begin(), myvector.begin()+3, myvector.end());
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 4 5 6 7 8 9 1 2 3

    rotate_copy

    #include <iostream>  // std::cout
    #include <algorithm> // std::rotate_copy
    #include <vector>    // std::vector
    
    template<class InputIterator, class OutputIterator>
    OutputIterator rotate_copy(InputIterator first, InputIterator middle,
            InputIterator last, OutputIterator result)
    {
        result = std::copy(middle, last, result);
        result = std::copy(first, middle, result);
    
        return result;
    }
    
    //-----Example-----
    int main()
    {
        int myints[] = {1,2,3,4,5,6,7,8,9};
        std::vector<int> myvector(9);
    
        std::rotate_copy(myints, myints+4, myints+9, myvector.begin());
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 5 6 7 8 9 1 2 3 4

    random_shuffle

    #include <iostream>  // std::cout
    #include <algorithm> // std::random_shuffle
    #include <vector>    // std::vector
    #include <ctime>     // std::time
    #include <cstdlib>   // std::rand, std::srand
    
    template<class RandomAccessIterator, class RandomNumberGenerator>
    void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
            RandomNumberGenerator &gen)
    {
        typename std::iterator_traits<RandomAccessIterator>::difference_type i, n;
        n = (last-first);
        for (i=n-1; i>0; --i)
        {
            std::swap(first[i], first[gen(i+1)]);
        }
    }
    
    //-----Example-----
    int myrandom(int i)
    {
        return std::rand()%i;
    }
    
    int main()
    {
        std::srand(unsigned(std::time(0)));
        std::vector<int> myvector;
        for (int i=1; i<10; i++)
        {
            myvector.push_back(i);
        }
    
        // using built-in random generator:
        std::random_shuffle(myvector.begin(), myvector.end());
        std::cout << "def-random contain:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        // using myrandom
        std::random_shuffle(myvector.begin(), myvector.end(), myrandom);
        std::cout << "sef-random contain:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //def-random contain: 7 8 4 2 6 3 5 1 9
    //sef-random contain: 6 1 9 8 4 3 7 5 2

    shuffle

    #include <iostream>  // std::cout
    #include <algorithm> // std::shuffle
    #include <array>     // std::array
    #include <random>    // std::default_random_engine
    #include <chrono>    // std::chrono::system_clock
    
    template<class RandomAccessIterator, class URNG>
    void Shuffle(RandomAccessIterator first, RandomAccessIterator last, URNG &&g)
    {
        for (auto i=(last-first)-1; i>0; --i)
        {
            std::uniform_int_distribution<decltype(i)> d(0, i);
            std::swap(first[i], first[d(g)]);
        }
    }
    
    //-----Example-----
    int main()
    {
        std::array<int, 5> foo{1,2,3,4,5};
        unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
        Shuffle(foo.begin(), foo.end(), std::default_random_engine(seed));
    
        std::cout << "shuffled elements:";
        for (int &x:foo)
        {
            std::cout << ' ' << x;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //shuffled elements: 3 1 4 2 5

    3.分割运算

    is_partitioned

    template <class InputIterator, class UnaryPredicate>
    bool is_partitioned(InputIterator first, InputIterator last, UnaryPredicate pred)
    {
        while (first!=last && pred(*first))
        {
            ++first;
        }
    
        while (first != last)
        {
            if (pred(*first))
            {
                return false;
            }
            ++first;
        }
    
        return true;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::is_partitioned
    #include <array>     // std::array
    
    bool IsOdd(int i)
    {
        return (i%2)==1;
    }
    
    int main()
    {
        std::array<int,7> foo{1,2,3,4,5,6,7};
    
        std::cout << "foo:";
        for (int &x:foo)
        {
            std::cout << ' ' << x;
        }
        if (std::is_partitioned(foo.begin(), foo.end(), IsOdd))
        {
            std::cout << " (partitioned)
    ";
        }
        else
        {
            std::cout << " (not partitioned)
    ";
        }
    
        std::partition(foo.begin(), foo.end(), IsOdd);
        std::cout << "foo:";
        for (int &x:foo)
        {
            std::cout << ' ' << x;
        }
        if (std::is_partitioned(foo.begin(), foo.end(), IsOdd))
        {
            std::cout << " (partitioned)
    ";
        }
        else
        {
            std::cout << " (not partitioned)
    ";
        }
    
        return 0;
    }
    
    //-----Output-----
    //foo: 1 2 3 4 5 6 7 (not partitioned)
    //foo: 1 7 3 5 4 6 2 (partitioned)

    partition

    #include <iostream>  // std::cout
    #include <algorithm> // std::partition
    #include <vector>    // std::vector
        
    template<class InputIterator, class UnaryPredicate>
    InputIterator partition(InputIterator first, InputIterator last, UnaryPredicate pred)
    {
        while (first != last)
        {
            while (pred(*first))
            {
                ++first;
            }
    
            if (first == last)
            {
                return first;
            }
    
            do 
            {
                --last;
                if (first == last)
                {
                    return first;
                }
            }while (!pred(*last));
    
            swap(*first, *last);
            ++first;
        }
    
        return first;
    }
    
    //-----Example-----
    bool IsOdd(int i)
    {
        return (i%2)==1;
    }
    
    int main()
    {
        std::vector<int> myvector;
        for (int i=1; i<10; ++i)
        {
            myvector.push_back(i);
        }
    
        std::vector<int>::iterator bound;
        bound = std::partition(myvector.begin(), myvector.end(), IsOdd);
    
        std::cout << "odd elements:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=bound; ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        std::cout << "even elements:";
        for (std::vector<int>::iterator it2=bound; it2!=myvector.end(); ++it2)
        {
            std::cout << ' ' << *it2;
        }    
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //odd elements: 1 9 3 7 5
    //even elements: 6 4 8 2

    stable_sort

    #include <iostream>  // std::cout
    #include <algorithm> // std::stable_partition
    #include <string>     // std::string
    
    bool myfunction(char c)
    {
        return c=='*';
    }
    
    int main()
    {
        std::string str = "***b**a**c**d**";
        std::string str1(str);
        std::string str2(str);
    
        std::partition(std::begin(str1), std::end(str1), myfunction);
        std::stable_partition(std::begin(str2), std::end(str2), myfunction);
    
        std::cout << "partition string=" << str1.c_str() << '
    ';
        std::cout << "stable_partition string=" << str2.c_str() << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //partition string=*************cdab
    //stable_partititon string=***********bacd

    partition_copy

    #include <iostream>  // std::cout
    #include <algorithm> // std::partition_copy
    #include <vector>    // std::vector
    
    template <class InputIterator, class OutputIterator1, class OutputIterator2, class UnaryPredicate>
    std::pair<OutputIterator1, OutputIterator2> partition_copy(InputIterator first, InputIterator last,
            OutputIterator1 result_true, OutputIterator2 result_false, UnaryPredicate pred)
    {
        while (first != last)
        {
            if (pred(*first))
            {
                *result_true = *first;
                ++result_true;
            }
            else
            {
                *result_false = *first;
                ++result_false;
            }
            ++first;
        }
    
        return std::make_pair(result_true, result_false);
    }
    
    //-----Example-----
    bool IsOdd(int i)
    {
        return (i%2)==1;
    }
    
    int main()
    {
        std::vector<int> foo{1,2,3,4,5,6,7,8,9};
        std::vector<int> odd,even;
    
        unsigned n = std::count_if(foo.begin(), foo.end(), IsOdd);
        odd.resize(n);
        even.resize(foo.size()-n);
    
        std::partition_copy(foo.begin(), foo.end(), odd.begin(), even.begin(), IsOdd);
    
        std::cout << "odd:";
           for (int &x:odd)
        {
            std::cout << ' ' << x;
        }
        std::cout << '
    ';
    
        std::cout << "even:";
           for (int &y:even)
        {
            std::cout << ' '<< y;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //odd: 1 3 5 7 9
    //even: 2 4 6 8

    partition_point

    #include <iostream>  // std::cout
    #include <algorithm> // std::partition std::partition_point
    #include <vector>    // std::vector
    
    template<class InputIterator, class UnaryPredicate>
    InputIterator partition_point(InputIterator first, InputIterator last, UnaryPredicate pred)
    {
        auto n = std::distance(first, last);
        while (n > 0)
        {
            InputIterator it = first;
            auto step = n/2;
            std::advance(it, step);
    
            if (pred(*first))
            {
                first = ++it;
                n -= step+1;
            }
            else
            {
                n = step;
            }
        }
    
        return first;
    }
    
    //-----Example-----
    bool IsOdd(int i)
    {
        return (i%2)==1;
    }
    
    int main()
    {
        std::vector<int> foo{1,2,3,4,5,6,7,8,9};
        std::vector<int> odd;
    
        std::partition(foo.begin(), foo.end(), IsOdd);
        auto it = std::partition_point(foo.begin(), foo.end(), IsOdd);
        odd.assign(foo.begin(), it);
    
        std::cout << "odd:";
        for (int &x:odd)
        {
            std::cout << ' ' << x;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //odd: 1 3 5 7 9

    4.排序

    sort

    #include <iostream>  // std::cout
    #include <algorithm> // std::sort
    #include <vector>    // std::vector
    
    bool myfunction(int i, int j)
    {
        return (i<j);
    }
    
    struct myclass
    {
        bool operator()(int i, int j)
        {
            return (i<j);
        }
    }myobject;
    
    int main()
    {
        int myints[] = {32,71,12,45,26,80,53,33};
        std::vector<int> myvector(myints, myints+8);            // 32 71 12 45 26 80 53 33
     
        std::sort(myvector.begin(),myvector.begin()+4);         //(12 32 45 71)26 80 53 33
        std::sort(myvector.begin()+4,myvector.end(),myfunction);//(12 32 45 71(26 33 53 80)
        std::sort(myvector.begin(),myvector.end(),myobject);    //(12 26 32 33 45 53 71 80)
    
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it= myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 12 26 32 33 45 53 71 80

    partial_sort

    #include <iostream>  // std::cout
    #include <algorithm> // std::partial_sort
    #include <vector>    // std::vector
    
    bool myfunction(int i, int j)
    {
        return (i<j);
    }
    
    int main()
    {
        int myints[] = {9,8,7,6,5,4,3,2,1};
        std::vector<int> myvector(myints, myints+9);
    
        std::partial_sort(myvector.begin(), myvector.begin()+5, myvector.end());
        std::partial_sort(myvector.begin(), myvector.begin()+5, myvector.end(), myfunction);
    
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 1 2 3 4 5 9 8 7 6

    partial_sort_copy

    #include <iostream>  // std::cout
    #include <algorithm> // std::partial_sort_copy
    #include <vector>    // std::vector
    
    bool myfunction(int i, int j)
    {
        return (i<j);
    }
    
    int main()
    {
        int myints[] = {9,8,7,6,5,4,3,2,1};
        std::vector<int> myvector(5);
    
        std::partial_sort_copy(myints, myints+9, myvector.begin(), myvector.end());
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        //std::partial_sort_copy(myints, myints+9, myvector.begin(), myvector.end(), myfunction);
        //std::cout << "myvector_self contains:";
        //for (std::vector<int>::iterator it2=myvector.begin(); it2!=myvector.end(); it2++)
        //{
        //    std::cout << ' ' << it2;
        //}
        //std::cout << '
    ';
    
        return 0;
    }
    
    //------Output-----
    //myvector contains: 1 2 3 4 5
    //myvector_self contains: 1 2 3 4 5

    is_sorted

    template<class InputInterator>
    bool is_sorted(InputInterator first, InputInterator last)
    {
        if (first == last)
        {
            return true;
        }
    
        InputInterator next = first;
        while (++next != last)
        {
            if (*next < *first)
            {
                return false;
            }
            ++first;
        }
    
        return true;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::is_sorted, std::prev_permutation
    #include <array>     // std::array
    
    int main()
    {
        std::array<int, 4> foo{2,4,1,3};
        do{
            std::prev_permutation(foo.begin(), foo.end());
    
            std::cout << "foo:";
            for (int &x:foo)
            {
                std::cout << ' ' << x;
            }
            std::cout << '
    ';
        }while (!std::is_sorted(foo.begin(),foo.end()));
    
        std::cout << "the range is sorted!
    ";
    
        return 0;
    }
    
    //foo: 1 2 3 4
    //the range is sorted!

    is_sorted_until

    template<class InputIterator>
    InputIterator is_sorted_until(InputIterator first, InputIterator last)
    {
        if (first == last)
        {
            return first;
        }
    
        InputIterator next = first;
        while (++next != last)
        {
            if (*next < *first)
            {
                return next;
            }
            ++first;
        }
    
        return last;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::is_sorted_until, std::prev_permutation
    #include <array>     // std::array
    
    int main()
    {
        std::array<int, 4> foo{2,4,1,3};
        std::array<int, 4>::iterator it;
    
        do{
        
            std::prev_permutation(foo.begin(), foo.end());
            std::cout << "foo:";
            for (int &x:foo)
            {
                std::cout << ' ' << x;
            }
    
            it = std::is_sorted_until(foo.begin(), foo.end());
            std::cout << " (" << (it-foo.begin()) << " elements sorted)
    ";
        }while (it != foo.end());
    
        std::cout << "the range is sorted!
    ";
    
        return 0;
    }
    
    //-----Output-----
    //foo: 1 2 3 4 (4 elements sorted)
    //the range is sorted!

    nth_element

    #include <iostream>  // std::cout
    #include <algorithm> // std::nth_element, std::random_shuffle
    #include <vector>    // std::vector
    
    bool myfunction(int i, int j)
    {
        return (i<j);
    }
    
    int main()
    {
        std::vector<int> myvector;
        for (int i=1; i<10; ++i)
        {
            myvector.push_back(i);
        }
    
        std::random_shuffle(myvector.begin(), myvector.end());
    
        // using default comparison
        std::nth_element(myvector.begin(), myvector.begin()+5, myvector.end());
    
        // using self function
        std::nth_element(myvector.begin(), myvector.begin()+5, myvector.end(), myfunction);
    
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 1 2 3 4 5 6 7 8 9

     5.二进制搜索

    lower_bound upper_bound

    #include <iostream>  // std::cout
    #include <algorithm> // std::lower_bound, std::upper_bound, std::sort
    #include <vector>    // std::vector
    
    template<class InputIterator, class T>
    InputIterator lower_bound(InputIterator first, InputIterator last, const T& val)
    {
        InputIterator it;
        typename std::iterator_traits<InputIterator>::difference_type count, step;
        count = std::distance(first, last);
        while (count > 0)
        {
            it = first;
            step = count/2;
            std::advance(it, step);
            if (*it < val)
            {
                first = ++it;
                count -= step+1;
            }
            else
            {
                count = step;
            }
        }
    
        return first;
    }
    
    template<class InputIterator, class T>
    InputIterator upper_bound(InputIterator first, InputIterator last, const T& val)
    {
        InputIterator it;
        typename std::iterator_traits<InputIterator>::difference_type count, step;
        count = std::distance(first, last);
        while (count > 0)
        {
            it = first;
            step = count/2;
            std::advance(it, step);
            if (*it > val)
            {
                first = ++it;
                count -= step+1; 
            }
            else
            {
                count = step;
            }
        }
    
        return first;
    }
    
    //-----Example-----
    int main()
    {
        int myints[] = {10,20,30,30,20,10,10,20};
        std::vector<int> myvector(myints, myints+8);
        std::sort(myvector.begin(), myvector.end());
    
        std::vector<int>::iterator low,up;
        low = std::lower_bound(myvector.begin(), myvector.end(), 20);
        up  = std::upper_bound(myvector.begin(), myvector.end(), 20);
    
        std::cout << "lower_bound at position:" << (low-myvector.begin()) << '
    ';
        std::cout << "upper_bound at position:" << (up-myvector.begin()) << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //lower_bound at position:3
    //upper_bound at position:6

    equal_range

    #include <iostream>  // std::cout
    #include <algorithm> // std::equal_range, std::sort
    #include <vector>    // std::vector
    
    template<class InputIterator, class T>
    std::pair<InputIterator, InputIterator>
    equal_range(InputIterator first, InputIterator last, const T& val)
    {
        InputIterator it = std::lower_bound(first, last, val);
        return std::make_pair(it, std::upper_bound(it, last, val));
    }
    
    //-----Example-----
    bool mygreater(int i, int j)
    {
        return (i>j);
    }
    
    int main()
    {
        int myints[] = {10,20,30,30,20,10,10,20};
        std::vector<int> myvector(myints, myints+8);
        std::pair<std::vector<int>::iterator,std::vector<int>::iterator> bounds;
    
        std::sort(myvector.begin(), myvector.end());
        // using default comparison:
        bounds = std::equal_range(myvector.begin(), myvector.end(), 20);
        
        std::sort(myvector.begin(), myvector.end(), mygreater);
        // using self conparison:
        bounds = std::equal_range(myvector.begin(), myvector.end(), 20, mygreater);
    
        std::cout << "bounds at positions:" << (bounds.first-myvector.begin()) << " and " << (bounds.second-myvector.begin()) << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //bounds at positions:2 and 5

    binary_search

    #include <iostream>  // std::cout
    #include <algorithm> // std::binary_search, std::sort
    #include <vector>    // std::vector
    
    template<class InputIterator, class T>
    bool binary_search(InputIterator first, InputIterator last, const T& val)
    {
        first = std::lower_bound(first, last, val);
        return ((first!=last) && !(val<*first));
    }
    
    //-----Example-----
    bool myfunction(int i, int j)
    {
        return (i<j);
    }
    
    int main()
    {
        int myints[] = {1,2,3,4,5,4,3,2,1};
        std::vector<int> myvector(myints,myints+9);
    
        // using default
        std::sort(myvector.begin(), myvector.end());
        std::cout << "looking for 3...";
        if (std::binary_search(myvector.begin(),myvector.end(), 3))
        {
            std::cout << " found!
    ";
        }
        else
        {
            std::cout << " not found!
    ";
        }
    
        // using self
        std::sort(myvector.begin(), myvector.end(),myfunction);
        std::cout << "looking for 6...";
        if (std::binary_search(myvector.begin(), myvector.end(), 6, myfunction))
        {
            std::cout << " found!
    ";
        }
        else
        {
            std::cout << " not found!
    ";
        }
    
        return 0;
    }
    
    //-----Output-----
    //looking for 3... found!
    //looking for 6... not found!

    6.合并运算

    Merge

    #include <iostream>  // std::cout
    #include <algorithm> // std::merge, std::sort
    #include <vector>    // std::vector
    
    template<class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
            InputIterator2 first2, InputIterator2 last2, OutputIterator result)
    {
        while (true)
        {
            if (first1 == last1)
            {
                return (std::copy(first2, last2, result));
            }
    
            if (first2 == last2)
            {
                return (std::copy(first1, last1, result));
            }
    
            *result++ = (*first2<*first1)?*first2++:*first1++;
        }
    }
    
    //-----Example-----
    int main()
    {
        int array1[] = {5,10,15,20,25};
        int array2[] = {1,11,21,31,41};
        std::vector<int> myvector(10);
    
        std::sort(array1,array1+5);
        std::sort(array2,array2+5);
        std::merge(array1, array1+5, array2, array2+5, myvector.begin());
        
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 1 5 10 11 15 20 21 25 31 41

     inplace_merge

    #include <iostream>  // std::cout
    #include <algorithm> // std::inplace_merge, std::sort
    #include <vector>    // std::vector
    
    int main()
    {
        int array1[] = {5,10,15,20,25};
        int array2[] = {41,31,21,11,1};
        std::vector<int> myvector(10);
    
        std::sort(array1, array1+5);
        std::sort(array2, array2+5);
    
        std::vector<int>::iterator it;
        it = std::copy(array1, array1+5, myvector.begin());
        std::copy(array2, array2+5, it);
    
        std::inplace_merge(myvector.begin(), myvector.begin()+5, myvector.end());
        std::cout << "myvector contains:";
        for (std::vector<int>::iterator it2=myvector.begin(); it2!=myvector.end(); ++it2)
        {
            std::cout << ' ' << *it2;
        }
        std::cout << '
    ';
        
        return 0;
    }
    
    //-----Output-----
    //myvector contains:1 5 10 11 15 20 21 25 31 41

    includes

    template<class InputIterator1, class InputIterator2>
    bool includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2)
    {
        while (first1!=last1 && first2!=last2)
        {
            if (*first2 < *first1)
            {
                return false;
            }
            else if (*first1 < *first2)
            {
                ++first1;
            }
            else
            {
                ++first1;
                ++first2;
            }
        }
    
        return first2==first1;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::includes, std::sort
    
    bool myfunction(int i, int j)
    {
        return i<j;
    }
    
    int main()
    {
        int array[] = {5,10,15,20,25,30,35,40,45,50};
        int subarray[] = {40,30,20,10};
    
        std::sort(array, array+10);
        std::sort(subarray, subarray+4);
    
        // using default
        if (std::includes(array, array+10, subarray, subarray+4))
        {
            std::cout << "first array includes subarray!
    ";
        }
        else
        {
            std::cout << "first not includes!
    ";
        }
    
        // using self
        if (std::includes(array, array+10, subarray, subarray+4, myfunction))
        {
            std::cout << "second array includes subarray!
    ";
        }
        else
        {
            std::cout << "second not includes!
    ";
        }
    
        return 0;
    }
    
    //-----Output-----
    //first array includes subarray
    //second array includes subarray

     set_union

    #include <iostream>  // std::cout
    #include <algorithm> // std::set_union, std::sort
    #include <vector>    // std::vector
    
    template<class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
            InputIterator2 first2, InputIterator2 last2, OutputIterator result)
    {
        while (true)
        {
            if (first1 == last1)
            {
                std::copy(first2, last2, result);
            }
    
            if (first2 == last2)
            {
                std::copy(first1, last1, result);
            }
    
            if (*first1 < *first2)
            {
                *result = *first1;
                ++first1;
            }
            else if (*first2 < *first1)
            {
                *result = *first2;
                ++first2;
            }
            else
            {
                *result = *first1;
                ++first1;
                ++first2;
            }
            ++result;
        }    
    
        return result;
    }
    
    //-----Example-----
    int main()
    {
        int firstArray[] = {5,10,15,20,25};
        int secondArray[] = {10,20,30,40,50};
    
        std::vector<int> myvector(10);
        std::vector<int>::iterator it;
    
        std::sort(firstArray, firstArray+5);
        std::sort(secondArray, secondArray+5);
        it = std::set_union(firstArray, firstArray+5, secondArray, secondArray+5, myvector.begin());
        myvector.resize(it-myvector.begin());
    
        std::cout << "myvector contains:";
        for (it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 5 10 15 20 25 30 40 50

    set_intersection

    template<class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
            InputIterator2 first2, InputIterator2 last2, OutputIterator result)
    {
        while (first1!=last1 && first2!=last2)
        {
            if (*first1 < *first2)
            {
                ++first1;
            }
            else if (*first2 < *first1)
            {
                ++first2;
            }
            else
            {
                *result = *first1;
                ++first1;
                ++first2;
                ++result;
            }
        }
    
        return result;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::set_intersection, std::sort
    #include <vector>    // std::vector
    
    int main()
    {
        int firstArray[] = {5,10,15,20,25};
        int secondArray[] = {10,20,30,40,50};
    
        std::vector<int> myvector(10);
        std::sort(firstArray, firstArray+5);
        std::sort(secondArray, secondArray+5);
    
        std::vector<int>::iterator it;
        it = std::set_intersection(firstArray, firstArray+5, secondArray, secondArray+5, myvector.begin());
        myvector.resize(it-myvector.begin());
    
        std::cout << "myvector contains:";
        for (it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 10 20

    set_difference

    #include <iostream>  // std::cout
    #include <algorithm> // std::set_difference, std::sort
    #include <vector>    // std::vector
        
    template<class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
            InputIterator2 first2, InputIterator2 last2, OutputIterator result)
    {
        while (first1!=last1 && first2!=last2)
        {
            if (*first1 < *first2)
            {
                *result = *first1;
                ++result;
                ++first1;
            }
            else if (*first2 < *first1)
            {
                ++first2;
            }
            else
            {
                ++first1;
                ++first2;
            }
        }
    
        return std::copy(first1, last1, result);
    }
    
    //-----Example-----
    int main()
    {
        int firstArray[] = {10,20,30,40,50};
        int secondArray[] = {5,10,15,20,25};
        std::vector<int> myvector(10);
    
        std::sort(firstArray, firstArray+5);
        std::sort(secondArray, secondArray+5);
        std::vector<int>::iterator it;
        it = std::set_difference(firstArray, firstArray+5, secondArray, secondArray+5, myvector.begin());
        
        myvector.resize(it-myvector.begin());
        std::cout << "myvector contains:";
        for (it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 30 40 50

    set_symmetric_difference

    #include <iostream>  // std::cout
    #include <algorithm> // std::set_symmetric_difference, std::sort
    #include <vector>    // std::vector
    
    template<class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
            InputIterator2 first2, InputIterator2 last2, OutputIterator result)
    {
        while(true)
        {
            if (first1 == last1)
            {
                return std::copy(first2, last2, result);
            }
    
            if (first2 == last2)
            {
                return std::copy(first1, last1, result);
            }
    
            if (*first1 < *first2)
            {
                *result = *first1;
                ++result;
                ++first1;
            }
            else if (*first2 < *first1)
            {
                *result = *first2;
                ++result;
                ++first2;
            }
            else
            {
                ++first1;
                ++first2;
            }
        }
    }
    
    //-----Example-----
    int main()
    {
        int firstArray[] = {5,10,15,20,25};
        int secondArray[] = {10,20,30,40,50};
        std::vector<int> myvector(10);
    
        std::sort(firstArray, firstArray+5);
        std::sort(secondArray, secondArray+5);
    
        std::vector<int>::iterator it;
        it = std::set_symmetric_difference(firstArray, firstArray+5, secondArray, secondArray+5, myvector.begin());
        myvector.resize(it-myvector.begin());
    
        std::cout << "myvector contains:";
        for (it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout <<  ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains:5 15 25 30 40 50

     7.堆运算

    make_heap pop_heap is_heap

    #include <iostream>  // std::cout
    #include <algorithm> // std::is_heap, std::make_heap, std::pop_heap
    #include <vector>    // std::vector
    
    int main()
    {
        std::vector<int> myvector{2,4,6,8,1,3,5,7,9};
        if (!std::is_heap(myvector.begin(), myvector.end()))
        {
            std::make_heap(myvector.begin(), myvector.end());
        }
    
        std::cout << "myvector contains:";
        while (!myvector.empty())
        {
            std::pop_heap(myvector.begin(), myvector.end());
            std::cout << ' ' << myvector.back();
            myvector.pop_back();
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //myvector contains: 1 2 3 4 5 6 7 8 9

    is_head_until

    #include <iostream>  // std::cout
    #include <algorithm> // std::is_heap_until, std::sort, std::reverse
    #include <vector>    // std::vector
    
    int main()
    {
        std::vector<int> myvector{2,4,6,8,9,7,5,3,1};
        std::sort(myvector.begin(), myvector.end());
        std::reverse(myvector.begin(), myvector.end());
    
        auto last = std::is_heap_until(myvector.begin(), myvector.end());
        std::cout << "The " << (last-myvector.begin()) << " first elements are a valid heap:";
        for (auto it=myvector.begin(); it!=myvector.end(); ++it)
        {
            std::cout << ' ' << *it;
        }
        std::cout << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //The 9 first elements are a valid heap: 9 8 7 6 5 4 3 2 1

     8.最小/最大运算

    min

    template<class T> const T& min(const T& a, const T& b)
    {
        return !(b<a)?a:b;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::min
    
    int main()
    {
        std::cout << "min(1,2)==" << std::min(1,2) << '
    ';
        std::cout << "min(2,1)==" << std::min(2,1) << '
    ';
        std::cout << "min('a','z')==" << std::min('a','z') << '
    ';
        std::cout << "min(3.14,2.72)==" << std::min(3.14,2.72) << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //min(1,2)==1
    //min(2,1)==1
    //min('a','z')==a
    //min(3.14,2.72)==2.72

    minmax

    #include <iostream>  // std::cout
    #include <algorithm> // std::minmax
    
    template<class T> std::pair<const T&, const T&> minmax(const T& a, const T&b)
    {
        return (b<a)?std::make_pair(b,a):std::make_pair(a,b);
    }
    
    int main ()
    {
        auto result = std::minmax({1,3,5,7,9});
        std::cout << "minmax({1,3,5,7,9}): ";
        std::cout << result.first << ' ' << result.second << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //minmax({1,3,5,7,9}): 1 9

    min_element max_element

    template<class InputIterator>
    InputIterator min_element(InputIterator first, InputIterator last)
    {
        if (first == last)
        {
            return last;
        }
    
        InputIterator smallest = first;
        while(++first != last)
        {
            if (*first < *smallest)
            {
                smallest = first;
            }
        }
    
        return smallest;
    }
    
    //-----Example-----
    #include <iostream>  // std::cout
    #include <algorithm> // std::min_element, std::max_element
    
    bool myfunction(int i, int j)
    {
        return i<j;
    }
    
    struct myclass
    {
        bool operator()(int i, int j)
        {
            return i<j;
        }
    }myobj;
    
    int main()
    {
        int myints[] = {3,7,2,5,6,8,4,1,9};
        std::cout << "min_element:" << *std::min_element(myints, myints+9) << '
    ';
        std::cout << "max_element:" << *std::max_element(myints, myints+9) << '
    ';
    
        std::cout << "min_element1:" << *std::min_element(myints, myints+9, myfunction) << '
    ';
        std::cout << "max_element1:" << *std::max_element(myints, myints+9, myfunction) << '
    ';
    
        std::cout << "min_element2:" << *std::min_element(myints, myints+9, myobj) << '
    ';
        std::cout << "max_element2:" << *std::max_element(myints, myints+9, myobj) << '
    ';
    
        return 0;    
    }
    
    //-----Output-----
    //min_element:1 
    //max_element:9
    //min_element1:1 
    //max_element1:9
    //min_element2:1 
    //max_element3:9

    minmax_element

    #include <iostream>  // std::cout
    #include <algorithm> // std::minmax_element
    #include <vector>    // std::vector
    
    int main()
    {
        std::vector<int> myvector{3,5,7,9,2,4,6,8,1};
        auto result = std::minmax_element(myvector.begin(), myvector.end());
    
        std::cout << "min_element is " << *result.first;
        std::cout << " and position at " << result.first-myvector.begin() << '
    ';
    
        std::cout << "max_element is " << *result.second;
        std::cout << " and postion at " << result.second-myvector.begin() << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //min_element is 1 and position at 8
    //max_element is 9 and position at 3

    9.其他

    lexicographical

    #include <iostream>  // std::cout
    #include <algorithm> // std::lexicographical_compare
    #include <cctype>    // std::tolower
    
    bool mycompare(char c1, char c2)
    {
        return std::tolower(c1)<std::tolower(c2);
    }
    
    int main()
    {
        char foo[] = "Apple";
        char bar[] = "apartment";
    
        std::cout << "def_compare:" << std::lexicographical_compare(foo, foo+5, bar, bar+9) << '
    ';
        std::cout << "self_compare:" << std::lexicographical_compare(foo, foo+5, bar, bar+9, mycompare) << '
    ';
    
        return 0;    
    }
    
    //-----Output-----
    //def_compare:1
    //self_compare:0

    next_permutation

    #include <algorithm> // std::next_permutation, std::sort
    
    int main()
    {
        int myints[] = {1,2,3};
    
        std::sort(myints, myints+3);
        std::cout << "{1,2,3} permutation:
    ";
        do {
            std::cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '
    ';
        }while(std::next_permutation(myints, myints+3));
    
        std::cout << "After loop:" << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '
    ';
        return 0;
    }
    
    //-----Output-----
    //{1,2,3} permutation:
    //1 2 3
    //1 3 2
    //2 1 3
    //2 3 1
    //3 1 2
    //3 2 1
    //After loop:1 2 3

    prev_permutation

    #include <iostream>  // std::cout
    #include <algorithm> // std::prev_permutation, std::sort, std::reverse
    
    int main()
    {
        int myints[] = {1,2,3};
    
        std::sort(myints, myints+3);
        std::reverse(myints, myints+3);
        std::cout << "{1,2,3} prev_permutation:" << '
    ';
        do{
            std::cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '
    ';
        }while(std::prev_permutation(myints, myints+3));
    
        std::cout << "After loop:" << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '
    ';
    
        return 0;
    }
    
    //-----Output-----
    //{1,2,3} prev_permutation:
    //3 2 1
    //3 1 2
    //2 3 1
    //2 1 3
    //1 3 2
    //1 2 3
    //After loop:3 2 1
  • 相关阅读:
    虚拟化资料
    Windows线程+进程通信
    Linux进程+进程间通信IPC
    COM/DOM/COM+
    C# 2.0新特性与C# 3.5新特性[转]
    [CruiseControl]配置文件config.xml
    C#的Delegate和Event
    [BuildRelease Management]Visual Build
    软件培训机构
    可以自动输入密码的Runas
  • 原文地址:https://www.cnblogs.com/sz-leez/p/6546898.html
Copyright © 2011-2022 走看看