C++ Algorithm iter_swap exchanges the elements pointed to by two iterators a and b.
Syntax
template <class ForwardIterator1, class ForwardIterator2>
void iter_swap (ForwardIterator1 a, ForwardIterator2 b);
Parameter
a : One of the forward iterator whose value is to be exchanged.
b : Second of the forward iterator whose value is to be exchanged.
Return value
Complexity
Constant
Data races
The objects pointed to by both iterators are changed.
Exception safety
Throws an exception if swap function has an exception.
Please note that invalid parameters cause an undefined behavior.
Example 1
Let's see the simple example to demonstrate the use 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 above example, we have swapped elements from v1 with the help of two iterators, one of them pointing at the beginning of v1 and the other one pointing at the end of v1.
Example 3
Let's see another simple example to swap the odd places of vector to odd paces of 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 above example illustrates the use of the iter_swap algorithm to swap integer values that are pointed to by two different iterators that may point into the same vector of integers, or into two different vectors of integers.
Example 5
Let's see another example to illustrate the use 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 }