C++ swap_ranges()
C++ 算法swap_ranges()
C++ 算法 swap_ranges()将范围[first1,last2)中的元素与范围中存在的元素交换简而言之, swap_ranges()交换两个序列的元素,也就是说,第一个序列中某个位置的每个元素都被替换为元素也可以位于第二个序列的相同位置,反之亦然。
语法
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2);
参数
first1 : 一个正向迭代器,指向要交换其元素的第一个范围的第一个位置。
last1 : 一个向前迭代器,指向要交换其元素的第一个范围的最终位置之后。
first2 : 一个向前迭代器指向要交换其元素的第二个范围的第一个位置。
返回值
swap_ranges()返回一个指向迭代器末尾的迭代器。
复杂度
复杂度在第一个和last之间是线性的。对范围内的每个元素执行交换操作。
数据竞争
两个范围内的对象都被修改。
异常安全
如果元素分配或对迭代器的操作抛出异常,则会引发异常。
示例1
让我们看一下简单交换给定范围内两个 Vector 的元素的示例:
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main() {
vector<int> v1 = { 1, 2, 3 };
vector<int> v2 = { 4, 5, 6, 7, 8 };
swap_ranges(v1.begin(), v1.end(), v2.begin());
cout << "v1: ";
copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, ", "));
cout << endl;
cout << "v2: ";
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, ", "));
cout << endl;
}
输出:
v1: 4, 5, 6,
v2: 1, 2, 3, 7, 8,
在上面的示例中, Vector v1的元素从 Vector v2的范围开始到v1的范围被交换。
示例2
让我们看一下交换两个 Vector 内容的简单示例:
#include <iostream>
#include <utility>
#include <vector>
using namespace std;
int main ()
{
vector<int> 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<int>::iterator i = v.begin() ; i!= v.end() ; i++)
cout<< *i <<" ";
cout<<endl;
for(vector<int>::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()函数用 Vector c的元素交换 Vector v的前五个元素。
示例3
让我们看到一个简单的示例来交换vector和deque的内容:
#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
deque <int> d1;
vector <int>::iterator v1Iter1;
deque<int>::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 <algorithm>
#include <iostream>
#include <string>
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