当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ std::swap_ranges用法及代码示例


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.
返回: It returns an iterator to the last element swapped in the second sequence.
// C++ program to demonstrate  
// the use of std::swap_ranges 
#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 
int main() 
{ 
    // Declaring first vector 
    vector<int> 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<int> 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 <iostream> 
#include <algorithm> 
#include <vector> 
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<int> v1 = { 1, 2, 3, 4, 5, 1, 2, 3, 4 }; 
  
    int i; 
  
    // Declaring second vector and making it equal to v1 
    vector<int> 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<int> v3 = { 1, 2, 3, 4, 1, 2, 3, 5 }; 
      
  
    // Declaring fourth vector and making it equal to v3 
    vector<int> 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,所以没有打印出来。

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



相关用法


注:本文由纯净天空筛选整理自 std::swap_ranges in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。