You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++多维vector执行v[i]=v[j]操作的时间复杂度为O(1)还是线性?

C++多维vector赋值操作v[i] = v[j]的时间复杂度解答

明确结论

该操作的时间复杂度分两种场景,不能一概而论:

  • 默认拷贝赋值场景:线性时间复杂度
  • C++11及以上的移动赋值场景:常数时间复杂度,也就是你提到的算法博客里的适用场景

具体原因拆解

1. []操作符的复杂度确认

和你查阅的资料一致,不管vector是多少维度,[]运算符仅做地址偏移计算、返回对应位置元素的引用,这一步的时间复杂度固定为O(1),不会影响整个赋值操作的复杂度量级。

2. 赋值操作的复杂度差异核心

整个表达式的复杂度由vector的=运算符逻辑决定:

  • 拷贝赋值(默认行为)
    标准库vector的拷贝赋值需要遍历右值vector的所有元素,逐份拷贝到左值vector的内存空间中,还要额外处理容量扩容、原有元素析构的逻辑,时间复杂度和右值vector存储的元素数量成线性关系,也就是参考页标注的线性复杂度。你写的v[i] = v[j]默认走的就是这个逻辑,复杂度为O(k),k是v[j]存储的元素总数。
  • 移动赋值(特殊场景)
    C++11版本之后引入了移动语义,当赋值的右值是临时对象,或者你显式通过std::move将右值转为右值引用时,vector的赋值不会做元素拷贝,只会交换两个vector内部的三个底层指针(数据起始指针、已用空间末尾指针、容量末尾指针),整个操作只涉及数次固定的指针赋值,时间复杂度为O(1)。
    你提到的算法博客里的说法就是基于这个场景,这类竞赛算法通常会显式使用移动赋值来优化复杂度,而且会默认放弃赋值后原v[j]的使用权(移动操作后原vector会处于有效但未定义的状态,一般不能再读取使用)。

内容的提问来源于stack exchange,提问作者user15904494

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 07:54:04