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),传入地址

三种方式的效果分别为:

  • 会发生拷贝构造
  • 不会发生拷贝构造
  • 不会发生拷贝构造

验证程序:

 #include <iostream>
#include <vector> using namespace std; void function1(std::vector<std::vector<int> > vec)
{
cout<<"-----------------------------------------"<<endl;
//打印vec的地址
cout<<"function1.&vec:"<<&vec<<endl;
//打印vec[i]的地址(即第一层vector的地址)
cout<<"function1.&vec[i]:"<<endl;
for(int i=;i<;i++)
cout<<&vec[i]<<endl;
//打印vec的各元素地址
cout<<"function1.&vec[i][j]:"<<endl;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
cout<<&vec[i][j]<<" ";
cout<<endl;
}
cout<<"---------------------------"<<endl;
//打印vec的各元素值
cout<<"function1.vec[i][j]:"<<endl;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
cout<<vec[i][j]<<" ";
cout<<endl;
}
}
void function2(std::vector<std::vector<int> >& vec)
{
cout<<"-----------------------------------------"<<endl;
//打印vec的地址
cout<<"function2.&vec:"<<&vec<<endl;
//打印vec[i]的地址(即第一层vector的地址)
cout<<"function2.&vec[i]:"<<endl;
for(int i=;i<;i++)
cout<<&vec[i]<<endl;
//打印vec的各元素地址
cout<<"function2.&vec[i][j]:"<<endl;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
cout<<&vec[i][j]<<" ";
cout<<endl;
}
cout<<"---------------------------"<<endl;
//打印vec的各元素值
cout<<"function2.vec[i][j]:"<<endl;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
cout<<vec[i][j]<<" ";
cout<<endl;
} }
void function3(std::vector<std::vector<int> > *vec)
{
cout<<"-----------------------------------------"<<endl;
//打印vec的地址
cout<<"function3.&vec:"<<vec<<endl;
//打印vec[i]的地址(即第一层vector的地址)
cout<<"function3.&vec[i]:"<<endl;
for(int i=;i<;i++)
cout<<&(*vec)[i]<<endl;
//打印vec的各元素地址
cout<<"function3.&vec[i][j]:"<<endl;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
cout<<&(*vec)[i][j]<<" ";
cout<<endl;
}
cout<<"---------------------------"<<endl;
//打印vec的各元素值
cout<<"function3.vec[i][j]:"<<endl;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
cout<<(*vec)[i][j]<<" ";
cout<<endl;
}
} int main()
{
//创建2*3的vector容器v,初始值均初始化为0 1 2 1 2 3
std::vector<std::vector<int> > v(,std::vector<int>(,));
for(int i=;i<;i++)
{
for(int j=;j<;j++)
v[i][j]=i+j;
} //打印v的地址
cout<<"&v:"<<&v<<endl;
//打印v[i]的地址(即第一层vector的地址)
cout<<"&v[i]:"<<endl;
for(int i=;i<;i++)
cout<<&v[i]<<endl;
//打印v的各元素地址
cout<<"&v[i][j]:"<<endl;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
cout<<&v[i][j]<<" ";
cout<<endl;
} cout<<"---------------------------"<<endl;
//打印v的各元素值
cout<<"v[i][j]:"<<endl;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
cout<<v[i][j]<<" ";
cout<<endl;
} function1(v);
function2(v);
function3(&v); return ;
}

输出(为便于观察,简单处理了一下效果):

简而言之,vector的内部存储模型是这个样子(以main()函数中的v为例):

关于12个字节的问题,请参考博客http://blog.csdn.net/kangroger/article/details/38386099

vector作为参数的三种传参方式的更多相关文章

  1. C++学习3--编程基础(vector、string、三种传参)

    知识点学习 Vector容器 vector是C++标准程序库中的一个类,其定义于头文件中,与其他STL组件一样,ventor属于STD名称空间: ventor是C++标准程序库里最基本的容器,设计之初 ...

  2. 浅谈C++三种传参方式

    浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...

  3. Vue-router的三种传参方式

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

  4. vue的三种传参方式

    <template> <div> <router-link :to="{'name':'x',params:{'type':'users'}}"> ...

  5. vector做形参时的三种传参方式

    vector在做形参的时候传参的方式和普通的变量是一样的,要么传值.要么传引用.要么传指针. 现在分别定义三个以vector为形参的函数: (1) fun1(vector <int> v) ...

  6. vue路由router的三种传参方式

    方法三: 传参页面传递参数方式: this.$router.push({ path: 'indexTwoDetails', query: { "id": id } }) 接受参数页 ...

  7. c# 三种传参方式 in,out,ref

    in:默认方式,传值不返回 out:不传值 但是会返回新值给予传参对象 ref:传存储地址,所以传参前必须赋值初始化,传值后的运算结果直接作用在传参上 Out和ref的效果差不多

  8. PHP四种传参方式

    test1界面: <html> <head> <title>testPHP</title> <meta http-equiv = "co ...

  9. vue param和query两种传参方式

    1.传参方式 query传参方式 this.$router.push({ path: "/home", query: {code:"123"} }) param ...

随机推荐

  1. 利用echo命令实现倒计时的功能

    echo -e:启用反斜线控制字符的转换        -E:关闭反斜线控制字符的转换(预设如此)        -n:取消行末之换行符号(与 -e 选项下的 \c 字符同意 -e参数下的控制参数 \ ...

  2. CodeBlocks常用重要快捷键大全!!

    CodeBlocks常用操作快捷键 编辑部分: Ctrl + A:全选 Ctrl + C:复制 Ctrl + X: 剪切 Ctrl + V:粘贴 Ctrl + Z:撤销(后退一步) Ctrl + S: ...

  3. The 15th UESTC Programming Contest Preliminary G - GC?(X,Y) cdoj1564

    地址:http://acm.uestc.edu.cn/#/problem/show/1564 题目: G - GC?(X,Y) Time Limit: 3000/1000MS (Java/Others ...

  4. js求三位数的和

    例如输入508就输出5+0+8的和13: <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  5. 手机自动化测试:appium源码分析之bootstrap三

    手机自动化测试:appium源码分析之bootstrap三   研究bootstrap源码,我们可以通过代码的结构,可以看出来appium的扩展思路和实现方式,从中可以添加我们自己要的功能,针对app ...

  6. QTP自动化测试培训:描述编程之WebElement

    QTP自动化测试培训:描述编程之WebElement   通过描述性编程技术,来描述出来输入框: set po=browser("creationtime:=0").page(&q ...

  7. 项目的ip地址更改,用git从远程提取代码出现错误,提示为 network error connection timed out

    昨天公司的ip进行了修改,在今天从远程提取代码的过程中提示network error connection timed out错误,从网上看了一下解决方法 1:打开项目文件夹,点击查看 2:勾选隐藏的 ...

  8. python作业设计:多级菜单,并可依次进入各级子菜单

    '''作业三:多级菜单 三级菜单 可依次选择进入各子菜单 所需新知识点:列表.字典 ''' data = { "北京":{ "昌平":{ "沙河&qu ...

  9. 浅谈如何让 Bootstrap 3兼容IE8浏览器

    Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目.-- Bootstrap 官网 Bootstrap 来自 Twitter,是目前最 ...

  10. JQuery分页插件封装(源码来自百度,自己封装)

    最近由于项目的需要,做了一个基于JQuery的表格分页插件封装,部分源码来源百度,经由自己封装完成. 下面是具体代码和说明,仅供参考.第一步可以先将我的HTML,CSS,JS这三部分的代码创建好后先运 ...