当一个std::vector对象在堆栈中而另一个在堆中时,vector的交换函数的时间复杂度为O(1)或O(n)
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)?
在c++参考网站http://www.cplusplus.com/reference/vector/vector/swap/它说std::vector的交换函数的复杂度是常数。我猜它可能通过改变vector对象的内容来归档,然而,当一个std::vector对象在堆栈中而另一个在堆中时,它不能通过改变vector对象的内容来归档。那么,是否vector的swap函数的复杂度总是0(1),当一个std::vector对象在堆栈中而另一个在堆中时,如何归档它?
vector的实际内容几乎总是在堆上。
这个引用还说:
具有相同类型的另一个vector容器(即用相同的模板参数,T和Alloc),其内容被交换
正如你所看到的,两个向量的分配器必须是相同的,这意味着实际的数据分配在相同的地方,默认情况下在堆上。
如果你查看cpprevention文档(通常更准确),它说:
如果std:: allocator_traits: propagate_on_container_swap:价值为true,则使用非限定调用交换分配器到非成员交换。否则,它们不会被交换(如果Get_allocator () != other.get_allocator(),行为未定义)。
所以你甚至可以用不同的分配器交换向量,如果它们是可交换的。无论如何,交换将是常量操作,因为数据不存储在vector对象本身中,而是存储在由分配器创建和管理的内存中。
相关文章:
- 编译器如何区分std::vector的构造函数
- 为什么std::vector和std::valarray初始化构造函数不同
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- std::vector 没有重载函数的实例与参数列表匹配
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- 为 std::vector 编写自定义插入函数
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- 是否可以将具有不同签名的 lambda 存储在 std::vector 中并在函数中执行它们(使用各自的参数)?
- 将 cv::Mat 转换为 std::vector 的通用函数
- 从 std::vector 迭代器中执行函数指针
- C++ std::vector 中的虚拟析构函数继承
- 错误:调用"es_queue::set_rpc_vector(std::vector >&, std::__cxx11::string)"没有匹配函数
- 调用2类继承的vector函数
- 在c++中,vector函数push_back会增加空数组的大小吗?
- 如何通过List
从Java到c++的std::vector函数参数使用JNA - 修改std::vector函数(继承?)
- 不能重载现有的std::vector函数