我想在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
}