📜  带有示例的C++ STL中的not1和not2函数模板

📅  最后修改于: 2021-05-30 09:23:50             🧑  作者: Mango

这些是采用一元和二进制函数对象(函数)并返回该函数对象的补码的函数。可以在竞争性编程中使用以获得二进制和一元函数的补充。

当编写补码函数的代码比较困难或冗长时,这些功能非常有用。例如,如果要从字符串删除辅音,则可以为isVowel写一元函数,并可以在STL的remove_if函数中使用其补码。

  1. not1:此函数采用一元函数对象并返回其补码对象。在这里,我们需要在函子中为一元函子定义arguments_type。

    句法:

    template  
      unary_negate 
        not1 (const Predicate& pred)
    {
      return unary_negate(pred);
    }
    

    参数:函数接受一个强制性参数pred ,该参数指定要否定的一元函数对象。

    返回值:该函数返回取反的一元对象。

    例子:

    // C++ program to demonstrate
    // not1 function template
      
    #include 
    using namespace std;
      
    struct pred {
        bool operator()(const int i) const
        {
            return (i % 2 == 0);
        }
      
        // defines argument_type for unary functor
        // it is begin used by not1
        // as argument_type
        typedef int argument_type;
    };
      
    // Driver code
    int main()
    {
        vector odd{ 1, 2, 3, 4, 5,
                         6, 7, 8, 9, 10 };
      
        // simple pred functor use
        // it removes even numbers
        auto end
            = remove_if(odd.begin(),
                        odd.end(),
                        pred());
      
        odd.resize(distance(odd.begin(), end));
      
        cout << "removal of even elements: ";
        for (int i = 0; i < odd.size(); i++) {
            cout << odd[i] << " ";
        }
        cout << "\n";
      
        vector even{ 1, 2, 3, 4, 5,
                          6, 7, 8, 9, 10 };
      
        // complement of pred using not1
        // which removes odd numbers
        end
            = remove_if(even.begin(),
                        even.end(),
                        not1(pred()));
      
        even.resize(distance(even.begin(), end));
      
        cout << "removal of odd elements: ";
        for (int i = 0; i < even.size(); i++) {
            cout << even[i] << " ";
        }
      
        return 0;
    }
    
    输出:
    removal of even elements: 1 3 5 7 9 
    removal of odd elements: 2 4 6 8 10
    
  2. not2:此函数以二进制仿函数为参数,并返回其补码仿函数。

    句法:

    template  
      binary_negate 
        not2 (const Predicate& pred)
    {
      return binary_negate(pred);
    }
    

    参数:函数接受一个强制性参数pred ,该参数pred指定要取反的二进制函数对象。

    返回值:该函数返回取反的二进制对象。

    例子:

    // C++ program to demonstrate
    // not2 function template
      
    #include 
    using namespace std;
      
    int main()
    {
        vector vec{ 4, 2, 7, 9, 3, 5, 10, 6 };
      
        // simple use of not2 just provide binary
        // functor and it will return it complement
        sort(vec.begin(), vec.end(), not2(less()));
      
        for (int i = 0; i < vec.size(); i++) {
            cout << vec[i] << " ";
        }
        return 0;
    }
    
    输出:
    10 9 7 6 5 4 3 2
    

    参考:

    • http://www.cplusplus.com/reference/functional/not1/
    • http://www.cplusplus.com/reference/functional/not2/
    要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”