C++ deque中pop_back后如何使用末尾元素?back()是否返回副本?
Deque容器末尾元素操作疑问解答
提问内容
我是从Python转C++的初学者,目前正在学习deque容器,对取出并使用末尾元素后再将其弹出的操作感到困惑。根据cppreference.com的说明,pop_back()会移除容器的末尾元素,且指向被移除元素的引用会失效。示例代码如下:
std::deque<int> numbers = {1, 2, 3}; int topNumber = numbers.back(); // Return reference to top element numbers.pop_back(); // remove the last element and now topNumber reference is invalidates
请问:如何在弹出末尾元素后仍能使用该元素?上述示例中back()是否返回了副本?若是,原因是什么?
解答
1. 弹出后仍使用末尾元素的方法
你写的这段代码其实已经实现了需求。topNumber是独立的int变量,当你把numbers.back()的结果赋值给它时,已经将容器末尾元素的数值拷贝到了topNumber里。哪怕之后调用pop_back()删掉容器里的原元素,topNumber里的数值依然保留,完全可以正常使用。
如果操作的是自定义类对象,逻辑也一致:先把back()返回的对象拷贝到新变量中,再执行pop_back(),新变量和容器内元素相互独立,不会受删除操作影响。
2. 关于back()是否返回副本
deque::back()本身返回的是引用,不是副本。但你示例里的topNumber是int类型(非引用),把引用赋值给普通变量时,C++会自动触发值拷贝,将引用指向的元素内容复制到topNumber中,所以topNumber是副本,但back()的返回值本质是引用。
这是C++基础语法规则:当引用被赋值给非引用类型变量时,会自动进行值拷贝,两者从此各自独立,互不影响。
内容的提问来源于stack exchange,提问作者juco
相关产品推荐
相关产品推荐

