📜  <utility>在C++中

📅  最后修改于: 2021-05-30 18:38:34             🧑  作者: Mango

这是一个头文件,其中包含无关域中的实用程序。

  • :这些是可以容纳两种不同类型值的对象。
  • 通用关系方法:用于特定名称空间rel_ops下的关系运算符!=,>,=。
  • 通用交换函数( Generic swap 函数) :这是标准定义,默认情况下,标准库的组件将其用于所有不提供自身重载的类型:swap。

职能:

  1. swap :交换两个对象的值。
    // CPP program to illustrate
    // the use of swap function
    #include      
    #include      
    using namespace std;
      
    // Driver Program
    int main () 
    {
      
        // a: _ _ _ _ (empty array in beginning)
        int a[4];         
          
        // Initializing, a: _ _ _ _ & b: 10 20 30 40
        int b[] = {10, 20, 30, 40};
          
        // After swapping, a: 10 20 30 40 & b: _ _ _ _
        swap(a, b);             
          
        cout << "a contains:";
        for (int i; i<4;i++) 
            cout << a[i]<

    输出:

    a contains:10
    20
    30
    40
    
  2. make_pair :构造一个配对,其第一个元素设置为x,第二个元素设置为y。
    // CPP program to illustrate
    // the use of make_pair 
    #include      
    #include  
    using namespace std;
      
    // Driver program
    int main () 
    {
          
        // Initializing the pair with int type
        pair  a;
        pair  b;
          
        // Use of the make_pair function
        a = make_pair (10, 20);
          
        // It's ok to write like this as implicit 
        // conversion takes place from pair
        b = make_pair (15.5, 'B'); 
          
        // Printing the fist and second values of the pair
        cout << "a: " << a.first << ", " << a.second << endl;
        cout << "b: " << b.first << ", " << b.second << endl;
          
        return 0;
    }
    

    输出:

    a: 10, 20
    b: 15, 66
    
  3. move :它作为右值移动。 move用于指示对象可以“从中移出”,即允许将资源从一个对象(要移动)转移到另一个对象。
    // CPP program to illustrate
    // the use of move 
    #include      
    #include      
    #include      
    #include      
    using namespace std;
      
    // Driver Program
    int main () 
    {
        string s = "Hello!!";
        string s1 = "I am a geek.";
        vector gfg;
          
        // It copies 's' in gfg
        gfg.push_back (s); 
          
        // It moves 's1' in the gfg(containing 's')
        gfg.push_back (move(s1));         
          
        cout << "gfg contains:";
        for (int i=0;i< gfg.size(); i++) 
            cout << ' ' << gfg[i];
        cout<

    输出:

    gfg contains: Hello!! I am a geek.
    
  4. move(元素范围) :它将[first,last)范围内的元素移到从结果开始的范围内。
    执行此操作后,移出范围内的元素仍将包含适当类型的有效值,但不一定与移走前的值相同。
    // CPP program to 
    // Illustrate the use of vector
    // move range of elements
    #include  
      
    // for move (ranges)
    #include  
      
    // for move (objects)
    #include    
    #include     
    #include  
    using namespace std;
      
    // Driver program
    int main () 
    {
        vector string1 = {"Hello!", "I", "am", "a", "geek"};
        vector string2 (5);
          
        // moving ranges:
        cout << "Moving ranges...\n";
          
        // use of move i.e.it moves from first to last element in 
        // string 1 to the string2 from it's(string 2) starting
        move ( string1.begin(), string1.begin()+5, string2.begin() );
          
        cout << "string1 contains " << string1.size() 
                                    << " elements\n";
          
        cout << "string2 contains " << string2.size() 
                            << " elements(after moving):";
          
        for (int i=0; i

    输出:

    Moving ranges...
    string1 contains 5 elements
    string2 contains 5 elements(after moving):Hello! I am a geek 
    
  5. move_if_noexcept :如果其move构造函数未引发异常,则获取对其参数的右值引用;否则,获取对其参数的左值引用。
    // CPP program to illustrate
    // the use of move_if_noexcept
    #include
    #include
    using namespace std;
      
    struct Bad
    {
          
        Bad() {}
          
        // may throw
        Bad(Bad&&) 
        {
            cout << "Throwing move constructor called"<

    输出:

    Non-throwing move constructor called
    Throwing copy constructor called
    
  6. decval :它返回一个右值引用,而不引用任何对象。
    如果自变量的移动构造函数从不抛出,则此函数选择参数的类型作为右值引用;如果该类型是可复制构造的,则该函数将其选择为左值引用。如果类型都不是,函数将返回一个右值,将为仅移动类型(即使它们可能抛出)选择该右值。
    某些操作可以通过移动或复制对象来实现,通常针对右值移动并针对左值进行复制:与不再需要对象(例如右值)时进行复制相比,移动通常是更有效的操作。
    // CPP program to illustrate 
    // the use of declval
    #include 
    #include 
    using namespace std;
      
    //class
    struct A 
    {
    virtual int value() = 0;
    };
      
    // Class with constructor
    class B : public A
    {
        int val_;
        public:
        B(int i, int j):val_(i*j){}
        int value() 
        {
            return val_;
              
        }
    };
      
    // Driver Program
    int main()
    {
        // int a
        decltype(declval().value()) a;
          
        // int b
        decltype(declval().value()) b;
              
        //same as constructor
        a = b = B(100, 20).value();
        cout << a << endl;
        return 0;
    }
    

    输出:

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