📜  C++ STL-algorithm.swap_ranges()函数

📅  最后修改于: 2020-10-17 04:24:40             🧑  作者: Mango

C++ STL algorithmswap_ranges()

C++ STL algorithm.swap_ranges()与[first1,last2)范围内的元素交换从first2开始的范围内的元素。

简而言之,swap_ranges()交换两个序列中的元素,也就是说,第一个序列中某个位置的每个元素被第二个序列中相同位置的元素替换,反之亦然。

句法

template 
  ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,
                                ForwardIterator2 first2);

参数

first1:指向要交换其元素的第一个范围的第一个位置的前向迭代器。

last1:一个正向迭代器,指向要交换其元素的第一个范围的最终位置之后的位置。

first2:指向要交换其元素的第二个范围的第一个位置的前向迭代器。

返回值

swap_ranges()返回一个迭代器,该迭代器指向要交换其元素的第二个范围的末尾。

复杂度

复杂度在第一个和最后一个之间是线性的。对范围中的每个元素执行交换操作。

数据竞争

两个范围内的对象均被修改。

异常安全

如果元素分配或迭代器上的操作抛出异常,则抛出异常。

例子1

让我们看一个简单的示例,以给定范围交换两个向量的元素:

#include 
#include 
#include 
#include 

using namespace std;

int main() {
  vector v1 = { 1, 2, 3 };
  vector v2 = { 4, 5, 6, 7, 8 };

  swap_ranges(v1.begin(), v1.end(), v2.begin());

  cout << "v1: ";
  copy(v1.begin(), v1.end(), ostream_iterator(cout, ", "));
  cout << endl;

  cout << "v2: ";
  copy(v2.begin(), v2.end(), ostream_iterator(cout, ", "));
  cout << endl;
}

输出:

v1: 4, 5, 6, 
v2: 1, 2, 3, 7, 8,

在上面的示例中,向量v1的元素从向量v2的范围开始到v1的结尾被向量v2交换。

例子2

让我们看一个简单的示例来交换两个向量的内容:

#include      
#include 
#include 

using namespace std;

int main ()
{
   vector v, c;
   for(int j=0; j < 10; j++)
   {
       v.push_back(j);
       c.push_back(j+1);
   }

   swap_ranges(v.begin(), v.begin()+5, c.begin());

   /* swaps the first five element of 
   vector v by the elements of vector c */

   for(vector::iterator i = v.begin() ; i!= v.end() ; i++)
   cout<< *i <<" ";

   cout<::iterator k = c.begin() ; k!= c.end() ; k++)
   cout<<*k<<" ";
}

输出:

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

在上面的示例中,swap_range()函数将向量v的前五个元素交换为向量c的元素。

例子3

让我们看一个简单的例子,交换vector和deque的内容:

#include   
#include   
#include   
#include   
  
int main( )   
{  
   using namespace std;  
   
   vector  v1;  
   deque  d1;  
   vector ::iterator v1Iter1;  
   deque::iterator d1Iter1;  
  
   int i;  
   for ( i = 0 ; i <= 5 ; i++ )  
   {  
      v1.push_back( i );  
   }  
  
   int ii;  
   for ( ii =4 ; ii <= 9 ; ii++ )  
   {  
      d1.push_back( 6 );  
   }  
  
   cout << "Vector v1 is: ( " ;  
   for ( v1Iter1 = v1.begin( ) ; v1Iter1 != v1.end( ) ;v1Iter1 ++ )  
      cout << *v1Iter1  << " ";  
   cout << ")." << endl;  
  
   cout << "Deque d1 is:  ( " ;  
   for ( d1Iter1 = d1.begin( ) ; d1Iter1 != d1.end( ) ;d1Iter1 ++ )  
      cout << *d1Iter1  << " ";  
   cout << ")." << endl;  
  
   swap_ranges ( v1.begin ( ) , v1.end ( ) , d1.begin ( ) );  
  
   cout << "After the swap_range vector v1 is: ( " ;  
   for ( v1Iter1 = v1.begin( ) ; v1Iter1 != v1.end( ) ;v1Iter1 ++ )  
      cout << *v1Iter1 << " ";  
   cout << ")." << endl;  
  
   cout << "After the swap_range deque d1 is:   ( " ;  
   for ( d1Iter1 = d1.begin( ) ; d1Iter1 != d1.end( ) ;d1Iter1 ++ )  
      cout << *d1Iter1 << " ";  
   cout << ")." << endl;  
   
   return 0;
}

输出:

Vector v1 is: ( 0 1 2 3 4 5 ).
Deque d1 is:  ( 6 6 6 6 6 6 ).
After the swap_range vector v1 is: ( 6 6 6 6 6 6 ).
After the swap_range deque d1 is:  ( 0 1 2 3 4 5 ).

在上面的示例中,vector和deque的元素相互交换。

例子4

让我们看另一个简单的例子:

#include 
#include 
#include 

using namespace std;

int main()
{
    string s1("Betty Botter bought some butter") ;
    string s2("But she said the butter was bitter") ;
    string s3("So she got some better butter") ;
    string s4("to make the bitter butter better") ;

    cout << "s1 = " << s1 << endl ;
    cout << "s2 = " << s2 << endl ;
    cout << "s3 = " << s3 << endl ;
    cout << "s4 = " << s4 << endl ;
    
    cout << "\nJumble them up!!!" << std::endl ;

    //swap_ranges
    swap_ranges(s1.begin(), s1.begin()+15, s2.begin()) ;
    swap_ranges(s3.begin(), s3.begin()+15, s4.begin()) ;

    cout << "s1 = " << s1 << endl ;
    cout << "s2 = " << s2 << endl ;
    cout << "s3 = " << s3 << endl ;
    cout << "s4 = " << s4 << endl ;

    return 0 ;
}

输出:

s1 = Betty Botter bought some butter
s2 = But she said the butter was bitter
s3 = So she got some better butter
s4 = to make the bitter butter better

Jumble them up!!!
s1 = But she said thught some butter
s2 = Betty Botter boe butter was bitter
s3 = to make the bit better butter
s4 = So she got someter butter better