C++中vector作为参数的三种传参方式
此文章转载自:http://www.cnblogs.com/xiaoxi666/p/6843211.html
c++中常用的vector容器作为参数时,有三种传参方式,分别如下(为说明问题,用二维vector):
- function1(std::vector<std::vector<int> > vec),传值
- function2(std::vector<std::vector<int> >& vec),传引用
- function3(std::vector<std::vector<int> >* vec),传指针
注意,三种方式分别有对应的const形式,不在此讨论。
三种方式对应的调用形式分别为:
- function1(vec),传入值
- function2(vec),传入引用
- function3(&vec),传入地址
三种方式的效果分别为:
- 会发生拷贝构造
- 不会发生拷贝构造
- 不会发生拷贝构造
验证程序:
1 #include <iostream>2 #include <vector>3 4 using namespace std;5 6 void function1(std::vector<std::vector<int> > vec)7 {8 cout<<"-----------------------------------------"<<endl;9 //打印vec的地址10 cout<<"function1.&vec:"<<&vec<<endl;11 //打印vec[i]的地址(即第一层vector的地址)12 cout<<"function1.&vec[i]:"<<endl;13 for(int i=0;i<2;i++)14 cout<<&vec[i]<<endl;15 //打印vec的各元素地址16 cout<<"function1.&vec[i][j]:"<<endl;17 for(int i=0;i<2;i++)18 {19 for(int j=0;j<3;j++)20 cout<<&vec[i][j]<<" ";21 cout<<endl;22 }23 cout<<"---------------------------"<<endl;24 //打印vec的各元素值25 cout<<"function1.vec[i][j]:"<<endl;26 for(int i=0;i<2;i++)27 {28 for(int j=0;j<3;j++)29 cout<<vec[i][j]<<" ";30 cout<<endl;31 }32 }33 void function2(std::vector<std::vector<int> >& vec)34 {35 cout<<"-----------------------------------------"<<endl;36 //打印vec的地址37 cout<<"function2.&vec:"<<&vec<<endl;38 //打印vec[i]的地址(即第一层vector的地址)39 cout<<"function2.&vec[i]:"<<endl;40 for(int i=0;i<2;i++)41 cout<<&vec[i]<<endl;42 //打印vec的各元素地址43 cout<<"function2.&vec[i][j]:"<<endl;44 for(int i=0;i<2;i++)45 {46 for(int j=0;j<3;j++)47 cout<<&vec[i][j]<<" ";48 cout<<endl;49 }50 cout<<"---------------------------"<<endl;51 //打印vec的各元素值52 cout<<"function2.vec[i][j]:"<<endl;53 for(int i=0;i<2;i++)54 {55 for(int j=0;j<3;j++)56 cout<<vec[i][j]<<" ";57 cout<<endl;58 }59 60 }61 void function3(std::vector<std::vector<int> > *vec)62 {63 cout<<"-----------------------------------------"<<endl;64 //打印vec的地址65 cout<<"function3.&vec:"<<vec<<endl;66 //打印vec[i]的地址(即第一层vector的地址)67 cout<<"function3.&vec[i]:"<<endl;68 for(int i=0;i<2;i++)69 cout<<&(*vec)[i]<<endl;70 //打印vec的各元素地址71 cout<<"function3.&vec[i][j]:"<<endl;72 for(int i=0;i<2;i++)73 {74 for(int j=0;j<3;j++)75 cout<<&(*vec)[i][j]<<" ";76 cout<<endl;77 }78 cout<<"---------------------------"<<endl;79 //打印vec的各元素值80 cout<<"function3.vec[i][j]:"<<endl;81 for(int i=0;i<2;i++)82 {83 for(int j=0;j<3;j++)84 cout<<(*vec)[i][j]<<" ";85 cout<<endl;86 }87 }88 89 int main()90 {91 //创建2*3的vector容器v,初始值均初始化为0 1 2 1 2 392 std::vector<std::vector<int> > v(2,std::vector<int>(3,0));93 for(int i=0;i<2;i++)94 {95 for(int j=0;j<3;j++)96 v[i][j]=i+j;97 }98 99 //打印v的地址 100 cout<<"&v:"<<&v<<endl; 101 //打印v[i]的地址(即第一层vector的地址) 102 cout<<"&v[i]:"<<endl; 103 for(int i=0;i<2;i++) 104 cout<<&v[i]<<endl; 105 //打印v的各元素地址 106 cout<<"&v[i][j]:"<<endl; 107 for(int i=0;i<2;i++) 108 { 109 for(int j=0;j<3;j++) 110 cout<<&v[i][j]<<" "; 111 cout<<endl; 112 } 113 114 cout<<"---------------------------"<<endl; 115 //打印v的各元素值 116 cout<<"v[i][j]:"<<endl; 117 for(int i=0;i<2;i++) 118 { 119 for(int j=0;j<3;j++) 120 cout<<v[i][j]<<" "; 121 cout<<endl; 122 } 123 124 function1(v); 125 function2(v); 126 function3(&v); 127 128 return 0; 129 }
输出(为便于观察,简单处理了一下效果):
简而言之,vector的内部存储模型是这个样子(以main()函数中的v为例):
关于12个字节的问题,请参考博客http://blog.csdn.net/kangroger/article/details/38386099
C++中vector作为参数的三种传参方式相关推荐
- vuerouter3种模式_Vue-router的三种传参方式
第一种传递参数:name传参 两步完成name传参并显示在模板中: 第一在router/index.js中配置name属性, routes: [ { path: '/', name: 'HelloWo ...
- Struts2三种传参方式(从jsp页面传到Action)
多的不说,直接上代码;struts.xml代码:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYP ...
- PHP基础传参,PHP四种传参方式
test1界面: testPHP //第一种设置传参方式,通过cookie setcookie('my','yefeng'); //第二种传参方式,通过设置服务器session值传递参数 sessio ...
- Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...
Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn 发布于:2012-09-15 ...
- resttemplate 设置请求头_Jmeter信息头管理器常用的三种传参格式
当我们在利用Jmeter进行接口测试时,其实相当于Jmeter模拟浏览器作为客户端,按照HTTP等协议发送报文给服务器端接口,以HTTP为例,他的请求报文包括请求行.请求头和请求体,今天要说的三种co ...
- 形实结合的三种传参方法
1. 形参与实参 形参:parameter(参量),用于接收传递值的变量 实参:argument(参数),传递给函数的值 2. 形实结合的三种传参方法 2.1 按值传递 void function(i ...
- mybatis参数有list和实体类_Mybatis的几种传参方式,你了解吗?
目录 前言 单个参数 多个参数 使用索引[不推荐] 使用@Param 使用Map POJO[推荐] List传参 数组传参 总结 前言 前几天恰好面试一个应届生,问了一个很简单的问题:你了解过Myba ...
- Mybatis的几种传参方式
本文来说下有关Mybatis的几种传参方式 文章目录 概述 单个参数 多个参数 使用索引[不推荐] 使用@Param 使用Map POJO[推荐] List传参 数组传参 本文小结 概述 本文说下My ...
- Jsp页面的几种传参方式
Jsp页面的几种传参方式 1.JavaScript传参:这种传参方式用opener关键字, 可以实现跨页传参.其用法就是用opener关键字调用父窗体的一个组件. 举例: opener.myfo ...
最新文章
- 微信小程序 - this.triggerEvent()
- 语法错误 : 缺少“;”(在“类型”的前面)的解决方案 转载
- php websocket 心跳包,websocket 心跳包重连
- uniapp同步获取用户信息_表单设计是为了帮助用户获取信息,而不是填写
- swift-01-利用元组判断字符串出现次数
- BZOJ 1673 [Usaco2005 Dec]Scales 天平:dfs 启发式搜索 A*搜索
- 一些实用但不为人知的Unix命令
- Eclipse ADT插件和主题
- mysql服务器版本手册_MySQL中文参考手册——与MySQL服务器连接
- 雨过天晴电脑保护系统 试用手记
- 设置div背景色为半透明
- 如何解决上传到github上的图片显示不出来的问题
- 判断质数、分解质因数
- 总结 拦截器(Interceptor) 和 过滤器(Filter)的区别
- jQuery - 基于serializeArray的serializeObject
- 2023 HGAME网络攻防大赛wp
- 在docker里跑gpgpusim
- 从JVM层面来解释i++和++i的真正区别
- 安卓10源码开发定制(23)内核系统调用openat Hook研究测试
- 2021年高压电工答案解析及高压电工考试技巧
热门文章
- mysql8.0新用户无法连接_mysql 8.0.16 Linux新建用户无法登录
- xampp mysql创建表_xampp怎样创建数据表和删除数据表 来学习吧
- web前端开发职业技能证书_1+x证书web前端开发职业技能等级标准1
- 定时器和promise_分析 Promise 内部实现
- 数学建模债券投资组合_1998年全国大学生数学建模竞赛题目A题投资的收益和风险.PDF...
- a标签禁止点击_Nofollow标签的使用
- 单片机的几种数字滤波算法
- 什么是编译器,什么是集成开发环境?一文讲明白
- android注册界面高级,Android用户注册界面简单设计
- html5游戏自动化测试,胡侃游戏自动化测试