繁体   English   中英

是否有 C++ function 对 std::stack 进行排序?

[英]Is there a C++ function to sort a std::stack?

我的代码中有一个std::stack ,我需要对其进行排序。 有没有内置的 function 可以做到这一点? 由于std::stack没有std::end 我可以使用std::sort还是必须 go 以使用辅助堆栈对原始堆栈进行排序的相同旧方法?

std::stack不是容器,而是容器适配器。

因此,鉴于它的预期语义——

充当底层容器的包装器 - 仅提供一组特定的功能。

——这是一个你无法对其进行排序的功能。

由于构造函数将任何给定容器复制到堆栈中,直接对堆栈 object 进行排序的唯一方法是对底层容器成员 object 进行排序:

成员对象

Container c底层容器(受保护的成员对象)

要做到这一点,您需要从堆栈中派生一个新的自定义类型,所有令人头疼的问题都源自 class 涉及的标准容器。

可能有一个 std::stack::sort 模板使用两个辅助堆栈和多相合并排序(时间复杂度 O(n log(n)),见下文),或者该模板可能已经基于底层容器类型实现: std::deque、std::list 或 std::vector,因为可以为 std::stack 指定容器类型,例如:

    std::stack <int, std::vector<int>> mystack;

std::sort 可用于 std::deque 或 std::vector(两者都有随机访问迭代器),而 std::list::sort 可用于 std::list。 我不知道 std::stack 是否允许其他容器类型或自定义容器类型; 如果允许,这将导致尝试基于容器类型创建 std::stack::sort 的问题。

使用辅助堆栈对原始堆栈进行排序

具有一个辅助堆栈的堆栈排序具有 O(n^2) 时间复杂度。 具有两个辅助堆栈的堆栈排序,基于多相归并排序,具有 O(n log(n)) 时间复杂度,但代码复杂。 将堆栈移动到数组或向量,对数组或向量进行排序,然后创建一个新的排序堆栈会更快。

如果您对 3 个堆栈(原始堆栈和 2 个辅助堆栈)的多相合并排序感到好奇,我编写了链接到下面的示例。 这些使用基于数组的自定义堆栈容器,并且与数组上的标准合并排序一样快,但需要 2 个临时堆栈。

很久以前,多相合并排序被用于磁带驱动器。 一些磁带驱动器可以向后读取,以避免倒带时间,本质上使它们像容器一样堆叠(向前写入,向后读取)。 对于磁带驱动器,可以使用不同大小的文件标记或记录来指示运行结束,从而无需跟踪代码的运行边界。 许多商业多相归并排序程序的高级版本是专有的,随着磁带排序逐渐消失在历史中,这些知识基本上随着时间的推移而丢失。

https://stackoverflow.com/a/38419908/3282056

template <class T, class U, class Compare>
void sort_stack(std::stack<T,U> &stack, Compare comp)
{
    std::vector<T> tmp_container;
    tmp_container.reserve(stack.size());
    while(!stack.empty())
    {
        tmp_container.push_back(std::move(stack.top()));
        stack.pop();
    }
    std::sort(tmp_container.begin(), tmp_container.end(), comp);
    for(auto it:tmp_container)
    {
        stack.push(std::move(it));
    }
}
template <class T, class U>
void sort_stack(std::stack<T,U> &stack)
{
    sort_stack(stack, std::less<T>());
}

据我所知,没有办法就地对堆栈进行排序。 但一种解决方法是使用额外的空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM