【问题标题】:when one std::vector object is in stack and the other one is in heap, is the time complexity of the swap function of vector is O(1) or O(n)?当一个 std::vector 对象在堆栈中而另一个在堆中时,vector 的交换函数的时间复杂度是 O(1) 还是 O(n)?
【发布时间】:2016-10-21 02:52:45
【问题描述】:

在 C++ 参考网站中 http://www.cplusplus.com/reference/vector/vector/swap/ 它说 std::vector 的交换函数的复杂性是恒定的。我想它可以通过更改对vector内容的引用来归档它,但是,当一个std :: vector对象在堆栈中而另一个在堆中时,它不能通过更改对内容的引用来归档它向量。那么,vector的swap函数的复杂度是否总是O(1),当一个std::vector对象在堆栈中而另一个在堆中时如何归档?

【问题讨论】:

    标签: c++ vector time-complexity swap


    【解决方案1】:

    向量的实际内容几乎总是在堆上。

    【讨论】:

      【解决方案2】:

      该参考还说:

      另一个相同类型的向量容器(即,用 相同的模板参数,T 和 Alloc),其内容被交换 这个容器的。

      如您所见,两个向量的分配器必须相同,这意味着实际数据分配在同一个地方,默认情况下在堆上。

      如果您查看 cpprefence documentation(通常更准确),它会说:

      如果 std::allocator_traits::propagate_on_container_swap::value 为真,则使用不合格的调用交换分配器 到非会员互换。否则,它们不会被交换(如果 get_allocator() != other.get_allocator(),行为未定义)。

      所以你甚至可以用不同的分配器交换向量,如果它们是可交换的。无论如何,交换将是持续操作,因为数据不存储在向量对象本身中,而是存储在分配器创建和管理的内存中。

      【讨论】:

        猜你喜欢
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 1970-01-01
        • 2019-12-13
        相关资源
        最近更新 更多