Vector作为参数的三种传参方式
来源:互联网 发布:逆波兰表达式递归C语言 编辑:程序博客网 时间:2024/05/20 05:45
转载:Vector作为参数的三种传参方式
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 3 92 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
原文出处:点击打开链接
或http://www.cnblogs.com/xiaoxi666/p/6843211.html
『注:本文来自博客园“小溪的博客”,若非声明均为原创内容,请勿用于商业用途,转载请注明出处http://www.cnblogs.com/xiaoxi666/』
阅读全文
0 0
- vector作为参数的三种传参方式
- Vector作为参数的三种传参方式
- C++中vector作为参数的三种传参方式
- std::list/vector 作为函数参数的传递方式
- 将vector作为参数传递
- 数组作为参数传递的方式
- C++ 中如何用 vector类作为函数的参数
- C++ 中如何用 vector类作为函数的参数
- vector作为参数传递的几种情况
- C++ 中如何用 vector类作为函数的参数
- 实战c++中的vector系列--vector<unique_ptr<>>作为函数的参数
- vector 作为参数和返回值
- vector作为参数传递到dll问题
- vector作为参数传递到dll问题
- vector作为参数传递到dll问题
- vector作为参数传递到dll问题
- vector作为参数传递到dll问题
- 二维数组的存储方式及其作为参数的方法
- 贪心算法 活动规划问题
- 数据显示序号问题
- 位运算
- http://koolshare.cn/thread-49179-1-1.html
- 第十二天总结
- Vector作为参数的三种传参方式
- 利用Thread子类在程序中实现多线程实例
- EA&UML日拱一卒-状态图::面向对象的另一种理解
- TensorFlow实现手写数字识别改进版
- 八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现
- ESP8266之NodeMcu调试记录
- pycharm快捷键、常用设置、配置管理
- “git 不是内部或外部命令,也不是可运行的程序 ”解决方案
- ubuntu 未能满足的依赖关系?或许你可以用 aptitude 管理你的软件包