Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swap neighbouring elements in std::list

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

like image 498
abrahab Avatar asked Jan 28 '26 11:01

abrahab


1 Answers

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
}
like image 104
Angew is no longer proud of SO Avatar answered Jan 31 '26 01:01

Angew is no longer proud of SO