I want to change places of neighbouring elements in the std::list
Example of the list and values
A B C D E F G
3 2 1 2 1 3 2
What I expect to receive after sorting:
A B D C F E G
3 2 2 1 3 1 2
So, simple A > B = nothing to do, but C < D = swap them and go to E comparison.
I have no idea about how to swap neighbor elements.
So, I want to move forward to 1 step good elements
You can easily do this by using two iterators:
void biswap(std::list<int> &l)
{
if (l.size() < 2)
return;
auto it2 = l.begin();
auto it1 = it2++;
auto e = l.end();
for (;;)
{
if (*it1 < *it2)
std::swap(*it1, *it2);
it1 = it2++;
if (it2 == e)
return;
it1 = it2++;
if (it2 == e)
return;
}
}
Live example
Note: in case you're not using C++11 and thus calling size() might present a significant overhead, you can replace it with this (and of course replace all usage of auto with explicit types):
void biswap(std::list<int> &l)
{
auto it2 = l.begin();
auto e = l.end();
if (it2 == e)
return;
auto it1 = it2++;
if (it2 == e)
return;
for (;;)
// ... the rest as before
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With