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 ...
随机推荐
- 使用moment.js轻松管理日期和时间
大家在前端Javascript开发中会遇到处理日期时间的问题,经常会拿来一大堆处理函数才能完成一个简单的日期时间显示效果.今天我给大家介绍一个轻量级的Javascript日期处理类库:moment.j ...
- CDN内容分发网络
CDN的全称是Content Delivery Network,即内容分发网络,其设计思想是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定. CDN系统是在网络 ...
- java iframe 嵌套,session失效重新登录页面嵌套问题
将后台跳转改写成 PrintWriter out = response.getWriter(); out.println("<html>"); out.print ...
- [SinGuLaRiTy] 树形存储结构阶段性测试
[SinGuLaRiTy-1011] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. G2019级信息奥赛专项训练 题目 程序名 时间 内存 ...
- 老李分享:持续集成学好jenkins之解答疑问
老李分享:持续集成学好jenkins之解答疑问 poptest(www.poptest.cn)在培训的过程中使用jenkins搭建持续集成环境,让学员真正交流持续集成到底是什么,怎么去做的. Je ...
- 1.Redis 的安装
一.Redis 介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 作为Key-value型数据库,Red ...
- JAVA加密算法系列-AES
package ***; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; ...
- mysql 分析3使用分析sql 性能 show profiles ;
show variables like '%profiling%'; 查看状态 查看时间去哪了``` set profiling=1;// 打开 show profiles; 查看执行过的 ...
- gulp 学习笔记
以这次学习gulp为契机来同时了解和学习node相关的知识和概念,比如 npm,package.json等,为以后学习node打好基础. 目录 npm 查看模块 安装模块 ...
- java多线程基本概述(三)——同步方法
非线程安全其实是在多个线程对同一个对象实例的变量进行并发访问的时候发生,产生的后果就是脏读,也就是取到的数据是修改过的.而线程安全就是获得的实例变量的值是经过同步处理的,从而不会出现脏读现象. 1.1 ...