The iter_swap function in C++ facilitates the swapping of elements that are pointed to by two iterators, denoted as a and b.
Syntax
template <class ForwardIterator1, class ForwardIterator2>
void iter_swap (ForwardIterator1 a, ForwardIterator2 b);
Parameter
One of the forward iterators whose value needs to be swapped.
b : The second element of the forward iterator whose value is intended to be swapped.
Return value
Complexity
Constant
Data races
The objects referenced by both iterators are modified.
Exception safety
Raises an exception in case the swap function encounters an exception.
Please be aware that using invalid parameters can lead to unpredictable behavior.
Example 1
Let's examine a basic example to showcase the functionality of iter_swap:
#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 };
iter_swap(v1.begin()+1, v2.begin()+2);
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;
return 0;
}
Output:
v1: 1, 6, 3,
v2: 4, 5, 2,
Example 2
Let's see another simple example:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
// Declaring first vector
vector<int> v1;
int i;
for (i = 0; i < 10; ++i) {
v1.push_back(i);
}
// v1 contains 0 1 2 3 4 5 6 7 8 9
vector<int>::iterator i1, i2;
i1 = v1.begin();
i2 = v1.end() - 1;
// Performing swap between first and last element
// of vector
std::iter_swap(i1, i2);
// Displaying v1 after swapping
for (i = 0; i < 10; ++i) {
cout << v1[i] << " ";
}
return 0;
}
Output:
9 1 2 3 4 5 6 7 8 0
In the previous illustration, elements have been interchanged within v1 using a pair of iterators - one positioned at the start of v1 and the other at the end of v1.
Example 3
Let's explore another basic example of rearranging the elements at odd indices of a vector with the elements at odd indices of an array:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(int v)
{
cout << v << " ";
}
int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector <int> v(10);
cout << "Vector : ";
for_each(v.begin(), v.end(), print);
cout << endl;
cout << "Array : ";
for_each(a, a + 10, print);
cout << endl;
for (int i = 1; i < 10; i+=2)
iter_swap(v.begin() + i, a + i);
cout << "\nSwapping odd places of vector with odd places of array"<< endl<<endl;
cout << "Vector : ";
for_each(v.begin(), v.end(), print);
cout << endl;
cout << "Array : ";
for_each(a, a + 10, print);
cout << endl;
return 0;
}
Output:
Vector : 0 0 0 0 0 0 0 0 0 0
Array : 1 2 3 4 5 6 7 8 9 10
Swapping odd places of vector with odd places of array
Vector : 0 2 0 4 0 6 0 8 0 10
Array : 1 0 3 0 5 0 7 0 9 0
Example 4
Let's see another simple example:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int a1[] = {1, 2, 3, 4, 5};
vector<int> v1(a1, a1+5);
cout <<"Here are the contents of v1:\n";
for (vector<int>::size_type i=0; i<v1.size(); i++)
cout <<v1.at(i)<<" ";
int a2[] = {2, 4, 6, 8, 10};
vector<int> v2(a2, a2+5);
cout <<"\nHere are the contents of v2:\n";
for (vector<int>::size_type i=0; i<v2.size(); i++)
cout <<v2.at(i)<<" ";
cout <<"\n\nFirst we swap the end values in v1.";
iter_swap(v1.begin(), v1.end()-1);
cout <<"\nHere are the contents of the revised v1:\n";
for (vector<int>::size_type i=0; i<v1.size(); i++)
cout <<v1.at(i)<<" ";
cout <<"\n\nThen we swap the middle values in v1 and v2.";
iter_swap(v1.begin()+2, v2.begin()+2);
cout <<"\nHere are the contents of the revised v1:\n";
for (vector<int>::size_type i=0; i<v1.size(); i++)
cout <<v1.at(i)<<" ";
cout <<"\nHere are the contents of the revised v2:\n";
for (vector<int>::size_type i=0; i<v2.size(); i++)
cout <<v2.at(i)<<" ";
return 0;
}
Output:
Here are the contents of v1:
1 2 3 4 5
Here are the contents of v2:
2 4 6 8 10
First we swap the end values in v1.
Here are the contents of the revised v1:
5 2 3 4 1
Then we swap the middle values in v1 and v2.
Here are the contents of the revised v1:
5 2 6 4 1
Here are the contents of the revised v2:
2 4 3 8 10
The example above demonstrates the functionality of the iter_swap algorithm, which is utilized to exchange integer values referenced by distinct iterators. These iterators can point to either the same integer vector or two separate integer vectors.
Example 5
Let's examine another instance to demonstrate the utilization of iter_swap:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// return the next Fibonacci number in the
// Fibonacci series.
int Fibonacci(void)
{
static int r;
static int f1 = 0;
static int f2 = 1;
r = f1 + f2 ;
f1 = f2 ;
f2 = r ;
return f1 ;
}
int main()
{
const int VECTOR_SIZE = 8 ;
// Define a template class vector of integers
typedef vector<int > IntVector ;
//Define an iterator for template class vector of integer
typedef IntVector::iterator IntVectorIt ;
IntVector Numbers(VECTOR_SIZE) ; //vector containing numbers
IntVectorIt start, end, it ;
start = Numbers.begin() ; // location of first
// element of Numbers
end = Numbers.end() ; // one past the location
// last element of Numbers
// fill the range [first, last +1) with a series of
// Fibonacci numbers using the Fibonacci function
generate(start, end, Fibonacci) ;
cout << "Before calling iter_swap" << endl ;
// print content of Numbers
cout << "Numbers { " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ;
// swap the first and last elements of the
// sequence using iter_swap
iter_swap(start, end - 1) ;
cout << "After calling iter_swap" << endl ;
// print content of Numbers
cout << "Numbers { " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << " }\n" << endl ;
return 0;
}
Output:
Before calling iter_swap
Numbers { 1 1 2 3 5 8 13 21 }
After calling iter_swap
Numbers { 21 1 2 3 5 8 13 1 }