【问题标题】:How to efficiently transfer the contents of an std::queue to another in C++98?如何在 C++98 中有效地将 std::queue 的内容传输到另一个?
【发布时间】:2021-10-07 00:27:37
【问题描述】:

在 C++11 或更高版本中,可以通过std::move() 有效地将一个std:queue 实例的所有内容传输到另一个std::queue 实例。然而,我正在使用的系统只有 C++98。如何在 C++98 中(高效地)执行相同的操作?

【问题讨论】:

  • std::swap 也许。
  • 嗨@SM,std::queue::swap 我认为是C++11? en.cppreference.com/w/cpp/container/queue/swap
  • 嗨@SM,将使用 C++98 的 std::swap() 与 C++11 的 std::move() 或 std::queue::swap() 一样省时?
  • 不确定它是否可用于 C++98 中的 std::queue,我假设它是可用的,因为它可用于 std::deque,而 std::queue 是 std::queue 的适配器::双端队列。是的,就像移动一样快。

标签: c++ queue c++98


【解决方案1】:

对于 C++98,您需要访问受保护的 c 成员,并交换 那些 容器。交换意味着快速和异常安全(实际上对于标准容器),并且是在添加 std::move 之前使用的习惯用法。

您可以通过派生和指向成员的指针来做到这一点。

template<typename E, class C>
void swapQueues(std::queue<E, C>& lhs, std::queue<E, C>& rhs) {
    struct peek : std::queue<E, C> {
        using std::queue<E, C>::c; // Grant access
    };
    C std::queue<E, C>::* ptr = &peek::c;
    (lhs.*ptr).swap(rhs.*ptr);
}

我们从队列类型中派生出peek ,从而得到可以访问c成员的类类型。然后我们立即在peek 中公开该成员。

之后,我们通过公共peek::c 获取指向该成员的指针。指针到成员的转换在这里是隐式的,允许我们初始化std::queue的成员指针。

最后,应用指向成员的指针来获取对每个队列的底层容器的引用并交换它们是一件简单的事情。

Here it is live

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多