此文章转载自: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作为参数的三种传参方式相关推荐

  1. vuerouter3种模式_Vue-router的三种传参方式

    第一种传递参数:name传参 两步完成name传参并显示在模板中: 第一在router/index.js中配置name属性, routes: [ { path: '/', name: 'HelloWo ...

  2. Struts2三种传参方式(从jsp页面传到Action)

    多的不说,直接上代码;struts.xml代码:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYP ...

  3. PHP基础传参,PHP四种传参方式

    test1界面: testPHP //第一种设置传参方式,通过cookie setcookie('my','yefeng'); //第二种传参方式,通过设置服务器session值传递参数 sessio ...

  4. Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...

    Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn   发布于:2012-09-15 ...

  5. resttemplate 设置请求头_Jmeter信息头管理器常用的三种传参格式

    当我们在利用Jmeter进行接口测试时,其实相当于Jmeter模拟浏览器作为客户端,按照HTTP等协议发送报文给服务器端接口,以HTTP为例,他的请求报文包括请求行.请求头和请求体,今天要说的三种co ...

  6. 形实结合的三种传参方法

    1. 形参与实参 形参:parameter(参量),用于接收传递值的变量 实参:argument(参数),传递给函数的值 2. 形实结合的三种传参方法 2.1 按值传递 void function(i ...

  7. mybatis参数有list和实体类_Mybatis的几种传参方式,你了解吗?

    目录 前言 单个参数 多个参数 使用索引[不推荐] 使用@Param 使用Map POJO[推荐] List传参 数组传参 总结 前言 前几天恰好面试一个应届生,问了一个很简单的问题:你了解过Myba ...

  8. Mybatis的几种传参方式

    本文来说下有关Mybatis的几种传参方式 文章目录 概述 单个参数 多个参数 使用索引[不推荐] 使用@Param 使用Map POJO[推荐] List传参 数组传参 本文小结 概述 本文说下My ...

  9. Jsp页面的几种传参方式

    Jsp页面的几种传参方式 1.JavaScript传参:这种传参方式用opener关键字, 可以实现跨页传参.其用法就是用opener关键字调用父窗体的一个组件. 举例:    opener.myfo ...

最新文章

  1. 微信小程序 - this.triggerEvent()
  2. 语法错误 : 缺少“;”(在“类型”的前面)的解决方案 转载
  3. php websocket 心跳包,websocket 心跳包重连
  4. uniapp同步获取用户信息_表单设计是为了帮助用户获取信息,而不是填写
  5. swift-01-利用元组判断字符串出现次数
  6. BZOJ 1673 [Usaco2005 Dec]Scales 天平:dfs 启发式搜索 A*搜索
  7. 一些实用但不为人知的Unix命令
  8. Eclipse ADT插件和主题
  9. mysql服务器版本手册_MySQL中文参考手册——与MySQL服务器连接
  10. 雨过天晴电脑保护系统 试用手记
  11. 设置div背景色为半透明
  12. 如何解决上传到github上的图片显示不出来的问题
  13. 判断质数、分解质因数
  14. 总结 拦截器(Interceptor) 和 过滤器(Filter)的区别
  15. jQuery - 基于serializeArray的serializeObject
  16. 2023 HGAME网络攻防大赛wp
  17. 在docker里跑gpgpusim
  18. 从JVM层面来解释i++和++i的真正区别
  19. 安卓10源码开发定制(23)内核系统调用openat Hook研究测试
  20. 2021年高压电工答案解析及高压电工考试技巧

热门文章

  1. mysql8.0新用户无法连接_mysql 8.0.16 Linux新建用户无法登录
  2. xampp mysql创建表_xampp怎样创建数据表和删除数据表 来学习吧
  3. web前端开发职业技能证书_1+x证书web前端开发职业技能等级标准1
  4. 定时器和promise_分析 Promise 内部实现
  5. 数学建模债券投资组合_1998年全国大学生数学建模竞赛题目A题投资的收益和风险.PDF...
  6. a标签禁止点击_Nofollow标签的使用
  7. 单片机的几种数字滤波算法
  8. 什么是编译器,什么是集成开发环境?一文讲明白
  9. android注册界面高级,Android用户注册界面简单设计
  10. html5游戏自动化测试,胡侃游戏自动化测试