使用迭代器排序列表不会对最后一个元素C++进行排序

Jas*_*son 0 c++ sorting iterator stl list

所以我正在尝试对列表进行排序.在每个子列表内部,元素是包含运行时的类.这是我用来排序列表的整数变量.

但是,如果最小的运行时位于列表的末尾,则列表不会100%排序.我在终端输出下面附有一张图像用于可视化.

这是代码:

void sort( list<list<MetaData> > &omegaList )
{
// variables
list<list<MetaData> >::iterator cursor = omegaList.begin();
list<list<MetaData> >::iterator ptr    = omegaList.begin();
list<list<MetaData> >::iterator end    = omegaList.end();

// start the bubble sort...
for(; cursor != end; cursor++)
{
    // iterate through the list
    for(; ptr != end; ptr++)
    {
        // compare runtimes of different lists
        if( ptr->front().getProcessRunTime() < cursor->front().getProcessRunTime() )
            {
            // swap locations of lists in omegaList
            swap( *ptr, *cursor );
            // reset
            cursor = ptr = omegaList.begin();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并输出: 运行程序的输出.

如果有人可以请你解释为什么它不会看最后一个元素,然后告诉我如何解决它我会很感激.

Ton*_*roy 5

进行排序的正确方法std::list::sort如下:

omegaList.sort(
    [](const list<MetaData>& lhs, const list<MetaData>& rhs) {
       return lhs.front().getProcessRunTime() <
              rhs.front().getProcessRunTime();
});
Run Code Online (Sandbox Code Playgroud)

你可以看到在这里运行.

在你的冒泡排序中,你的第一个元素没有被排序的原因是,一旦你找到一个无序元素,你就这样做......

cursor = ptr = omegaList.begin();
Run Code Online (Sandbox Code Playgroud)

...然后ptr++ for-loop操作启动,因此您的排序重新开始begin() + 1.这cursor = ptr = omegaList.begin();是非常疯狂的 - 我见过的第一个O(n ^ 3)排序实现.

  • @Claudiu:这是一个长期的,琐碎的麻烦,但至少[范围提案](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4128.html)应该解决它soonish. (2认同)
  • 哈哈,很高兴我能让你大吃一惊,很高兴你能引导我走上正确的道路.我知道这是一个糟糕的算法(就像真的很糟糕),但我更担心的是编写这个程序而不是执行多长时间.我计划明天通过更好的实施重写它,但现在你已经向我展示了这些金矿.非常感谢. (2认同)