【问题标题】:c++11 clearing a container with std::swap vs operator=(T&&)c++11 用 std::swap vs operator=(T&&) 清除容器
【发布时间】:2014-02-01 20:00:31
【问题描述】:

在 c++11 中哪种方式更好/更快地清除容器(例如队列):

void clean()
{
   std::queue<int> empty_q;
   std::swap(q_to_clear, empty_q);
}

或使用 operator=(Q &&) (比 swap 快?)

void clean ()
{
    q_to_clear = std::queue<int>{};
}

或者本质上是一样的?

【问题讨论】:

    标签: c++ c++11 std


    【解决方案1】:

    这可能几乎没有什么区别,但是移动分配要求临时源队列在被移动后需要建立一个新的空状态,您可以通过交换来避免这种情况。你可以编写如下交换:

    std::queue<int>().swap(q_to_clear);
    

    【讨论】:

    • "...move-assignment 要求临时源队列需要建立一个新的、空状态" 嗯...实际上,move-assignment 不需要。搬出的容器不保证/不需要变空。
    【解决方案2】:

    C++11-ness 提升到极致:

    decltype(q_to_clear)().swap(q_to_clear);
    

    也适用于其他 std:: 容器。

    和 compact memory 语法很酷:

    decltype(q_to_compact)(q_to_compact).swap(q_to_compact);
    

    【讨论】:

    • compact memory版本有什么用? ...啊,你复制了q_to_compact。 {} 会更清楚地说明这一点,还是你害怕初始化列表问题?
    • @Yakk - 这是为了释放过度分配的内存。 std::vector 的默认分配策略是在容量耗尽时将容量增加 x2,因此最终可能会浪费一半的内存。因此,您从现有向量创建一个临时向量(该向量将具有与大小完全匹配的容量),交换是您想要压缩的向量的胆量,并让它超出范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多