【问题标题】:Sorting list using iterators won't sort last element C++使用迭代器排序列表不会排序最后一个元素 C++
【发布时间】:2015-10-28 03:06:13
【问题描述】:

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

但是,如果最小的运行时位于列表的末尾,则列表不会 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();
            }
        }
    }
}

然后输出:

如果有人可以向我解释为什么它不会查看最后一个元素,然后告诉我如何修复它,我将不胜感激。

【问题讨论】:

  • 我不确定您的错误在哪里,但我认为您的 冒泡排序 实现不正确。
  • 嗯,这或多或少只是“这就像冒泡排序一样效率极低,所以我将称之为冒泡排序。”
  • 你为什么不使用std::sort
  • 好问题。我不知道它,我不确定我将如何实现它,因为我有一个列表列表,并且它是需要在更大列表中排序的子列表。

标签: c++ list sorting stl iterator


【解决方案1】:

进行排序的正确方法是使用std::list::sort,如下所示:

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

你可以看到运行here

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

cursor = ptr = omegaList.begin();

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

【讨论】:

  • 很好,忘了你不能在std::lists上使用std::sort
  • @Claudiu:如果专门拨打std::list::sort,那就太好了,但是AFAIK还没有完成;不过,我还没有考虑过实施问题以知道它是否实用。
  • 是的。这是让我感到难过的 C++ 的众多设计决策之一 - 99% 的时间我都在做 some_function(x.begin(), x.end(), ...),而在 IMO 中做 some_function(x, ...) 会更干净。如果x 不是最短的表达式,则尤其相关。就您而言,它将允许std::sort 专攻std::list::sort
  • @Claudiu:这是一个长期存在的琐碎问题,但至少 range proposal 应该尽快解决它。
  • 哈哈,很高兴我能给你一个惊喜,也很高兴你能引导我走上正确的道路。我知道这是一个糟糕的算法(就像真的很糟糕),但我更担心编写这个程序而不是执行需要多长时间。我计划明天通过更好的实现来重写它,但现在你已经向我展示了这些金矿。非常感谢。
猜你喜欢
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
相关资源
最近更新 更多