📜  C++中的std :: swap_ranges

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

std :: swap用于在两个容器之间交换元素。其变体之一是std :: swap_ranges,顾名思义,它用于交换范围内的元素。

它只是将[first1,last1)范围内的每个元素的值与它们从first2开始的范围内的各个元素的值进行交换。如果看一下它的内部工作原理,我们会发现该函数本身使用std :: swap()。

句法:

std::swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,
                  ForwardIterator2 first2);

Here, first1, last1 and first2 are forward iterators.
Returns: It returns an iterator to the last element swapped in the second sequence.
// C++ program to demonstrate 
// the use of std::swap_ranges
#include 
#include 
#include 
using namespace std;
int main()
{
    // Declaring first vector
    vector v1;
    int i;
      
    // v1 contains 0 1 2 3 4 5 6 7 8 9
    for (i = 0; i < 10; ++i) 
    {
        v1.push_back(i);
    }
      
  
    // Declaring second vector
    // v2 contains 100 100 100 100 100
    vector v2(5, 100);
      
    // Performing swap
    std::swap_ranges(v1.begin() + 3, v1.begin() + 7, v2.begin());
  
    // Displaying v1 after swapping
    for (i = 0; i < 10; ++i) 
    {
        cout << v1[i] << " ";
    }
  
    cout << "\n";
      
    // Displaying v2 after swapping
    for (i = 0; i < 5; ++i) 
    {
        cout << v2[i] << " ";
    }
  
    return 0;
}

输出:

0 1 2 100 100 100 100 7 8 9
3 4 5 6 100

在此程序中,我们从v1开始交换元素,从v1.begin()+ 3到v1.begin()+ 7,其值从v2.begin()开始,因此代替交换整个向量,我们在一定范围内执行了交换。

在哪里可以使用?
当我们必须查找给定容器的上半部和后半部中是否包含相同的元素时,即两个半部是否彼此相同时,可以使用它。

// C++ program to demonstrate 
// the use of std::swap_ranges
#include 
#include 
#include 
using namespace std;
int main()
{
    // Here 5 is the central element and the two halves
    // on its either side contain the same elements 1 2 3 4
    vector v1 = { 1, 2, 3, 4, 5, 1, 2, 3, 4 };
  
    int i;
  
    // Declaring second vector and making it equal to v1
    vector v2 = v1;
  
    // Here there is no central element and the two halves
    // are 1 2 3 4 and 1 2 3 5 which are different
    vector v3 = { 1, 2, 3, 4, 1, 2, 3, 5 };
      
  
    // Declaring fourth vector and making it equal to v3
    vector v4 = v3;
  
    // Performing swap between two halves of vector v1
    if (v1.size() % 2 == 0)
        std::swap_ranges(v1.begin(), v1.begin() + (v1.size() / 2),
                        v1.begin() + v1.size() / 2);
  
    else
        std::swap_ranges(v1.begin(), v1.begin() + v1.size() / 2,
                        v1.begin() + (v1.size() / 2) + 1);
  
    if (v1 == v2) 
    {
        cout << "Yes";
    } else 
    {
        cout << "No";
    }
  
    // Now, Performing swap between two halves of vector v3
    if (v3.size() % 2 == 0)
        std::swap_ranges(v3.begin(), v3.begin() + (v3.size() / 2),
                        v3.begin() + v3.size() / 2);
  
    else
        std::swap_ranges(v3.begin(), v3.begin() + v3.size() / 2,
                        v3.begin() + (v3.size() / 2) + 1);
  
    cout << "\n";
  
    if (v3 == v4) 
    {
        cout << "Yes";
    } else 
    {
        cout << "No";
    }
  
    return 0;
}

输出:

Yes
No

代码说明:在此代码中,我们声明了一个向量,然后将其分配给另一个向量,然后在第一个向量中,根据前半部分与后半部分的值交换,具体取决于它是否包含奇数。元素的存在与否。如果在交换值之后,新的第一个向量与第二个向量(旧的第一个向量)相同,则意味着两个部分都相同。

因此,在第一个向量1 2 3 4 5 1 2 3 4中,两个半部都包含相同的元素,因此打印了是,而在第二个向量1 2 3 4 1 2 3 5中,后一半包含的元素与前半部分,即用4代替5,所以没有打印出来。

时间复杂度:首尾之间的距离呈线性关系。

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