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++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。