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),传入地址
三种方式的效果分别为:
- 会发生拷贝构造
- 不会发生拷贝构造
- 不会发生拷贝构造
验证程序:
#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作为参数的三种传参方式的更多相关文章
- C++学习3--编程基础(vector、string、三种传参)
知识点学习 Vector容器 vector是C++标准程序库中的一个类,其定义于头文件中,与其他STL组件一样,ventor属于STD名称空间: ventor是C++标准程序库里最基本的容器,设计之初 ...
- 浅谈C++三种传参方式
浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...
- Vue-router的三种传参方式
第一种传递参数:name传参 两步完成name传参并显示在模板中: 第一在router/index.js中配置name属性, routes: [ { path: '/', name: 'HelloWo ...
- vue的三种传参方式
<template> <div> <router-link :to="{'name':'x',params:{'type':'users'}}"> ...
- vector做形参时的三种传参方式
vector在做形参的时候传参的方式和普通的变量是一样的,要么传值.要么传引用.要么传指针. 现在分别定义三个以vector为形参的函数: (1) fun1(vector <int> v) ...
- vue路由router的三种传参方式
方法三: 传参页面传递参数方式: this.$router.push({ path: 'indexTwoDetails', query: { "id": id } }) 接受参数页 ...
- c# 三种传参方式 in,out,ref
in:默认方式,传值不返回 out:不传值 但是会返回新值给予传参对象 ref:传存储地址,所以传参前必须赋值初始化,传值后的运算结果直接作用在传参上 Out和ref的效果差不多
- PHP四种传参方式
test1界面: <html> <head> <title>testPHP</title> <meta http-equiv = "co ...
- vue param和query两种传参方式
1.传参方式 query传参方式 this.$router.push({ path: "/home", query: {code:"123"} }) param ...
随机推荐
- MCMC(二)马尔科夫链
MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)M-H采样和Gibbs采样(待填坑) 在MCMC(一)蒙特卡罗方法中,我们讲到了如何用蒙特卡罗方法来随机模拟求解一些复杂的连续积分或 ...
- 关于SQL的一些小知识
在代码中调用存储过程的时,必须先测试存储过程,存储过程测试成功之后再去java中去调用!!@!@#!@!@! 以后自己写的存储过程写一个本地保存一个.!~~~!!(这个很关键) 以后在代码中的SQL都 ...
- 自己写的一个 java swing 的闹钟
上一周新入职,把代码down下来之后,领导和我讲了一些大概的业务以及代码流程(领导是技术出身),领导让我自己先看看代码,然后我看了两天,觉得已经完全可以接任务了,但是领导却迟迟没有分配任务给我,虽然他 ...
- exports和module.exports的区别
总结:exports是module.exports的指向. 1. module应该是require方法中,上下文中的对象 2. exports对象应该是上下文中引用module.exports的新对象 ...
- 老李分享:Web Services 组件 2
WSDL 是一种基于 XML 的语言,它用来对 web service 及其如何访问进行描述. WSDL 表示 web service 描述语言(Web Services Description La ...
- 微信小程序首页总结
效果图如下 首先从大的方面来讲,就是设置了window的属性 "navigationBarBackgroundColor": "#AFE2E6",//bar ...
- .NET中数据访问方式(一):LINQ
语言集成查询(Language-Integrated Query),简称LINQ,.NET中的LINQ体系如下图所示: 在编程语言层次,LINQ对于不同的数据源提供了相同的查询语法,方便了程序员操 ...
- 原型prototype、原型链__proto__、构造器constructor
创建函数时,会有原型prototype,有原型链__proto__,有constructor.(构造函数除外,没有原型) . prototype原型:是对象的一个属性(也是对象),使你有能力向对象添加 ...
- asp.net core源码飘香:Options组件
简介: Options组件是一个小组件,但用的地方很多.它本质是将一个POCO类注册到容器中(主要在Startup中作为其他组件的配置功能提供),后续使用的时候就可以通过比如构造函数注入等获取到POC ...
- 【 js 基础 】 深浅拷贝
underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...