vector作为参数的三种传参方式

时间:2022-09-01 22:00:16

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作为参数的三种传参方式

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

vector作为参数的三种传参方式

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

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

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

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

  2. 浅谈C&plus;&plus;三种传参方式

    浅谈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'}}"&gt ...

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

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

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

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

  7. c&num; 三种传参方式 in&comma;out&comma;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. 《像计算机科学家一样思考Java》—— 读后总结

    本书属于入门级的Java书籍,与其他的向编程思想.核心技术不同的是,这本书不是按部就班的讲解java变成知识,而是随着语言的深入慢慢增加知识点. 这本书以一个语言开发者的角度,深入浅出的讲解了Java ...

  2. 微信小程序 - 开发指南

    一.下载并安装开发工具 下载地址 二.创建项目 打开开发工具 添加项目 进入预览和调试界面 代码编辑器 编译并预览 三.启动流程 四.适用场景 五.技术框架 六.科普 [图片较大 - 点击查看]

  3. CSS3 text-overflow 属性

    1. <!DOCTYPE html> <html> <head> <style> div.test { white-space:nowrap; widt ...

  4. hdu 2061

    PS:  以为找个简单来恢复信心..结果碰到那么傻逼的题目... 题意:给出学分和成绩,算GPA...关键是注意换行....它要求的换行我觉得超级奇怪...除了第一个正常,其他的输入完之后先一个换行. ...

  5. Java Web开发之Servlet、JSP基础

    有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础. 我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发 ...

  6. Oracle Application Express &lpar;APEX 4&period;2&rpar; 中进行ajax调用

    Oracle Application Express 4.2 (APEX 4.2)是一个快捷的web应用开发工具.在开发网页的过程中有时候会用到ajax请求. 建立ajax请求的方式: 1.建立后台的 ...

  7. JFinal 学习笔记之Handler包分析

    HandlerFactory.java HandlerFactory是不可实例化的,因为 它的构造 函数 特意定位 私有 的:它有一个 静态的方法叫做 getHandler,它有两个参数 ,一个是Ha ...

  8. UNION ALL的用法

    " ?> -mapper.dtd" > <mapper namespace="com.j1.soa.resource.order.oracle.dao. ...

  9. 搭建(WSTMart)php电商环境时缺少fileinfo函数

    搭建WSTMart环境步骤: 第一步:安装phpstudy,一键安装即可 第二步:把下好的系统源码,放到一个文件夹中,并放到刚刚安装好的phpstudy下WWW文件夹下,如WWW>WSTMart ...

  10. Android开发环境(发展演变)

    初步接触android,要安装android开发工具时是使用eclipse,这是因为百度靠前的搜索项是eclipse来开 发android,而且那时还不知道android studio. 首先是下载配 ...