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. javascript . 02 break和continue、while、数组、冒泡排序

    1.1 知识点 NaN是number类型 null是object类型 /**  + 回车  多行注释 table 会为内部的tr td 自动补齐闭合标签 1.2 循环结构 1.2.1  Break和c ...

  2. 如何给sublime text3安装汉化包?so easy 哦

    这是我本人亲身测试过的,肯定有效,没用的话怪我咯. 首先安装package control,然后安装汉化包即可,很简单哦!!! 1.安装package control:打开sublime,使用快捷键: ...

  3. 开源 & 免费使用 & 打包下载自行部署 :升讯威 周报系统

    这个周报系统大约写于2015年,缘起当时所带的开发团队需要逐步建立或完善一些项目管理方法. 在调研了网上的诸多项目管理或周报/日报管理系统之后,并没有找到符合当时情况的系统,这里最大的问题不是网上既有 ...

  4. javaScriptCore 实战 与 小结

      源码在这,看不懂的直接撸源码就行,转载声明出处 原生调用JS的大致流程,做了个思维简图 这是代码流程 // JS数据 func getJSVar() { let context: JSContex ...

  5. taobao-pamirs-proxycache开源缓存代理框架实现原理剖析

    写在前面 taobao-pamirs-proxycache 是一款开源缓存代理框架, 它将 缓存代码 与 业务代码 解耦.让开发专注coding业务, 缓存通过xml配置即可实现.本文先从此工具如何使 ...

  6. Linux批量清理多个文件内容而不删除文件

    清理单个文件,可以这样:echo > myLog.log 但是,如果我要清理一堆文件,比如在/logs目录下面的所有以.log结尾的文件的内容,而不删除文件,该如何操作呢? 我一开始的语句是这样 ...

  7. 20155304 2016-2017-2 《Java程序设计》第六周学习总结

    20155304 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章 串流设计的概念 无论来源和目的地实体形式是什么,只要取得InputStream和Ou ...

  8. D3.js-坐标轴生成测试SVG

    Bottom top Bottom top   // =0) return "translate("+margin+","+i*offset+")&q ...

  9. git初学笔记1

    之前对于软件的版本管理全靠粘贴辅助,觉得很low,而且也不是很方便.听前辈说git很好用,然后就学了一下. 今天主要学了些基本的操作命令,总结如下: 1. git最基本的操作  2. commit提交 ...

  10. jsp的开发模式

    JSP 存在两种 开发模式1.Model1 : JSP + JavaBean * 不适合开发业务逻辑特别复杂web应用 ----- 业务逻辑复杂,控制代码多,而在jsp中编写控制代码,十分不便 *JS ...