我想在std::list中更改相邻元素的位置
列表和值的示例

A B C D E F G
3 2 1 2 1 3 2
我希望在排序后收到什么:
A B D C F E G
3 2 2 1 3 1 2
因此,简单的A > B =无事可做,但C < D =交换它们并进行E比较。
我不知道如何交换邻居元素。
所以,我想前进到第一步good元素

最佳答案

您可以使用两个迭代器轻松完成此操作:

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

注意:如果您不使用C++ 11并因此调用size()可能会带来很大的开销,则可以用此替换它(当然,还要使用显式类型替换auto的所有用法):
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
}

09-06 20:41