首页 > 其他分享 >对类中std::vector私有成员进行更改

对类中std::vector私有成员进行更改

时间:2024-04-09 17:57:17浏览次数:22  
标签:std myVector 对类 vector 引用 使用 拷贝

本文是对 C++关于vector做返回值的引用细节 的延申

问题一:使用vector作为函数返回值时,加&与不加&有什么区别

在C++中,当函数返回一个vector时,可以选择在返回类型中使用引用(&)或者不使用引用的方式。这两种方式有一些区别,主要涉及到拷贝构造和性能。

1.使用引用 (&):

std::vector<int>& functionWithRefReturn() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};
    return myVector;
}
  • 优点: 避免了拷贝构造,返回的是原始向量的引用,没有额外的开销。
  • 缺点: 可能导致悬空引用(dangling reference)问题,因为函数结束后局部变量 myVector 将被销毁,但引用仍然指向已经被销毁的对象。所以这种写法是错误的。(这种写法报错)

2.不使用引用:

std::vector<int> functionWithoutRefReturn() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};
    return myVector;
}
  • 优点: 返回的是原始向量的副本,避免了悬空引用的问题。
  • 缺点: 有一定的性能开销,因为需要进行向量的拷贝构造。

在某些情况下,还可以使用移动语义(move semantics)来提高性能。C++11引入了右值引用和移动构造函数,可以通过std::move将临时对象的所有权转移给返回的对象,减少了拷贝的开销。示例如下:

std::vector<int> functionWithMoveReturn() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};
    return std::move(myVector);
}

在使用移动语义时,需要注意避免悬空引用的问题,确保不再使用已经移动的对象。

 

标签:std,myVector,对类,vector,引用,使用,拷贝
From: https://www.cnblogs.com/imreW/p/18124454

相关文章

  • 吴恩达机器学习笔记:第 7 周-12支持向量机(Support Vector Machines)12.1-12.3
    目录第7周12、支持向量机(SupportVectorMachines)12.1优化目标第7周12、支持向量机(SupportVectorMachines)12.1优化目标到目前为止,你已经见过一系列不同的学习算法。在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法......
  • 第四个OpenGL程序,vector 向量 (矩阵变换之 旋转,缩放)后续 绘制多个 图形
    效果: 代码main.cpp#include<iostream>#include<glad/glad.h>#include<glfw3.h>#include"Shader.h"#defineSTB_IMAGE_IMPLEMENTATION#include<stb_image.h>#include<glm/glm.hpp>#include<glm/gtc/matrix_transfo......
  • std::format 如何实现编译期格式检查
    C++20的std::format是一个很神奇、很实用的工具,最神奇的地方在于它能在编译期检查字符串的格式是否正确,而且不需要什么特殊的使用方法,只需要像使用普通函数那样传参即可。#include<format>inta=1;std::strings1=std::format("a:{}",a);//OKstd::strings2=s......
  • CentOS安装RustDesk自建服务器
    一、安装node.js1、下载并解压[root@VM-8-2-centossrc]#cd/usr/local#下载node文件[root@VM-8-2-centoslocal]#wgethttps://registry.npmmirror.com/-/binary/node/v16.18.1/node-v16.18.1-linux-x64.tar.gz#解压文件[root@VM-8-2-centoslocal]#sudotar-zxvfno......
  • C++ //练习 11.14 扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair
    C++Primer(第5版)练习11.14练习11.14扩展你在11.2.1节练习(第378页)中编写的孩子姓到名的map,添加一个pair的vector,保存孩子的名和生日。环境:LinuxUbuntu(云服务器)工具:vim 代码块/************************************************************************* >Fil......
  • VisualStduio如何自定义代码片段
    什么是代码片段代码片段又叫CodeSnippet,可以用来快捷补全代码。其实我们经常使用这个功能。比如for循环,输入for会弹出这个窗口 我们选择第二个for,再按两次Tab键,编辑器就会自动生成完整的for循环代码。代码片段怎么使用注意蓝色的i方块,我们输入其他循环变量,再按下Tab键,所......
  • win server系统物理机转成虚拟机出现 计算机丢失api-ms-win-crt-stdio-|1-1-0.dll问题
     物理机转移虚拟机的方案有很多种,这里讲下官方的这个转移工具转移,很简单下载下来一步步跟着点就好了。但是server系统的话可能会出现如图这样子的报错,缺少dll文件,这是因为server系统本身缺少这个文件组,解决方式有两种:1.去下载dll表文件,放置对应的文件夹下面,重新迁移2.利用......
  • C++ std常用math函数
    std::atan和std::atan2std::atan(x)  即tan(angle)=x  所求angle范围[-PI/2,PI/2] [-90°,90°]std::atan2(y,x)即tan(angle)=y/x 所求angle范围[-PI,PI][-180°,180°]  std::fmod(x,y)计算x/y的浮点余数,如std::fmod(3.1,2)=1.1对浮点数进行......
  • 【Python BUG】ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CX
    报错ImportError:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:version`CXXABI_1.3.9‘notfound背景开发的一个python预测程序(算法分析+应用服务),在原本的linux服务器下配置了开发环境,打包后在另一台凝思服务器解压,发现报错。应该是linux系统之间存在差异,动态库缺失......
  • std::function
    std::functional 是C++标准库中的一个模板类,它是对可调用对象的一种通用包装器。std::functional 允许你将任何可调用对象(包括函数、函数对象、lambda表达式、以及其他 std::functional 对象)当作一个统一的对象来处理。它通常与C++的算法库、容器库以及某些需要可调用对......