首页 > 其他分享 >引用与vector

引用与vector

时间:2023-11-05 13:44:47浏览次数:32  
标签:... int tr vector 引用 拷贝

今天写线段树合并的时候,忽然想到可以用vector存树,这样就不用算空间了。

然后有了下面代码:

void modify(int& u,int l,int r,int p,int k) {
	if (!u) u=newnode();
	if (l==r) {
		tr[u].max+=k;
		tr[u].id=p;
		return;
	}
	int mid=(l+r)>>1;
	if (p<=mid) modify(tr[u].ls,l,mid,p,k);
	else modify(tr[u].rs,mid+1,r,p,k);
	pushup(u);
}

看着很对,对吧?

但是这样子并不会将值更新到tr[u].lstr[u].rs

然后经过数h的痛苦debug,有了如下测试代码:

int main() {
    a.push_back(0);
    cout<<a[0]<<' '<<&a[0]<<endl;
    a.push_back(1);
    cout<<a[0]<<' '<<&a[0]<<endl;
    return 0;
}

原来是vector扩容之后,因为内部机制的关系,所有元素都会被拷贝到一个新地址。

然后此时的引用地址还是原来的,但是存的已经不是那个对应的元素了。

vector扩容之后,引用和迭代器会失效。

here

虽然不清楚怎么快速拷贝区间的,但是貌似复杂度还是\(O(1)\)。

貌似拷贝区间还是\(O(n)\),但是每次拷贝的区间长度会倍增(1.5倍或者是2倍),然后均摊下来的复杂度就是很小了。


参考资料:

一步步带你观察... by 老乐大魔王

vector中... by 智慧的人不要秃头

标签:...,int,tr,vector,引用,拷贝
From: https://www.cnblogs.com/zhangchenxin/p/17810443.html

相关文章

  • 引用不可作为局部变量的返回值
    1.概述由于引用实际上是指向被引用变量的一个隐式指针,而局部变量在返回后就会被销毁,我指向的内容被销毁了,这个隐式指针也就成了野指针,导致错误2.实例错误写法以下是我在运算符重载时使用引用作为局部变量返回值导致的问题:Person&operator+(Person&t);{Personp;p.mem_a......
  • UE4蓝图对Actor的引用
    通过关卡蓝图调用在关卡中放置一个Actor,在关卡蓝图中右键createareferencetoactor,即可注意使用该方法创建时,需要现在关卡中选择上该类Actor当Actor生成时创建其的引用当我们在蓝图中利用SpawnActorfromClass生成Actor节点返回值拖出promotetovariable,提升为变量即可......
  • 无涯教程-MongoDB - 数据库引用
    如MongoDB关系的最后一章所示,为了在MongoDB中实现规范化的数据库结构,无涯教程使用了引用关系的概念,也称为ManualReferences,其中无涯教程手动将参考文件的ID存储在其他文件中。但是,如果文档包含来自不同集合的引用,则可以使用MongoDBDBRefs。使用DBRefDBRefs中有三个字段-......
  • 左值引用和右值引用
    高级架构工程师C++进阶课程(内存泄漏、面试、开源框架、协程、STL、C++11新特性、即时通讯)_哔哩哔哩_bilibili什么是左值可以在等号左边,可以取地址,具名intmain(intargc,charconst*argv[]){inti=0;++i=10;(i+=10)=1000;cout<<i<<endl;......
  • 神经网络基础篇:向量化(Vectorization)
    向量化向量化是非常基础的去除代码中for循环的艺术,在深度学习安全领域、深度学习实践中,会经常发现自己训练大数据集,因为深度学习算法处理大数据集效果很棒,所以的代码运行速度非常重要,否则如果在大数据集上,代码可能花费很长时间去运行,将要等待非常长的时间去得到结果。所以在深度......
  • 问题描述:未能加载文件或程序集或它的某一个依赖项。找到的程序集清单定义与程序集引用
    报错原因:    版本不统一问题 解决方法:    右键打开“管理解决方案的NuGet程序包”--->将项目引用的程序包版本改统一(一般情况下用最新稳定版) ......
  • java 基本数据类型和引用数据类型
    ......
  • 查看python中import可以支持的格式引用
    importimportlib.machineryformat_list=importlib.machinery.all_suffixes()print(format_list)so是linux可以加载的文件,windows是pyc ......
  • 弱符号与强符号 vs 弱引用与强引用
    弱符号与强符号说明对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。我们也可以通过GCC的"__attribute__((weak))"来定义任何一个强符号为弱符号。注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用。比如我们有下面这段程序:......
  • Offset多维引用
    问题:为何使用Vlookup套Offset查找三个表中对应结果会出错公式:=VLOOKUP(C12,OFFSET(C4,,{0,3,6},3,2),2,)Offset,以C4为起点,向右分别偏移0、3、6,产生新单元格区域为3行两列,这一结果为多维引用,无法在同一单元格内正常显示Vlookup函数无法提取多维引用的结果多维引用解法1:=SUM......