首页 > 系统相关 >vector传递内存参数的三种方式

vector传递内存参数的三种方式

时间:2023-05-14 16:55:55浏览次数:64  
标签:std function1 cout vector 三种 内存 vec

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(vector<vector<int> > vec)
{
    cout << "-----------------------------------------" << endl;
    //打印vec的地址
    cout << "function1.&vec:" << &vec << endl;
    //打印vec[i]的地址(即第一层vector的地址)
    cout << "function1.&vec[i]:" << endl;
    for (int i = 0; i < 2; i++)
                 cout << &vec[i] << endl;
    //打印vec的各元素地址
    cout << "function1.&vec[i][j]:" << endl;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
            cout << &vec[i][j] << " ";
        cout << endl;
    }
    cout << "---------------------------" << endl;
}
void function2(vector<vector<int> >& vec)
{
    cout << "-----------------------------------------" << endl;
    //打印vec的地址
    cout << "function2.&vec:" << &vec << endl;
    //打印vec[i]的地址(即第一层vector的地址)
    cout << "function2.&vec[i]:" << endl;
    for (int i = 0; i < 2; i++)
    {
        cout << &vec[i] << endl;
    }
    //打印vec的各元素地址
    cout << "function2.&vec[i][j]:" << endl;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
                cout << &vec[i][j] << " ";
        cout << endl;
    }
    cout << "---------------------------" << endl;
}
void function3(vector<vector<int> > *vec)
{
    cout << "-----------------------------------------" << endl;
    //打印vec的地址
    cout << "function3.&vec:" << &vec << endl;
    //打印vec[i]的地址(即第一层vector的地址)
    cout << "function3.&vec[i]:" << endl;
    for (int i = 0; i < 2; i++)
    {
        cout << &vec[i] << endl;
    }
    //打印vec的各元素地址
    cout << "function3.&vec[i][j]:" << endl;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
            cout << &(*vec)[i][j] << " ";
        cout << endl;
    }
    cout << "---------------------------" << endl;
}
int main()
{
    //创建一个2x3的vector数组
    vector<vector<int> > v(2, vector<int> (3,0));
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            v[i][j] = i + j;      //0 1 2 1 2 3
        }
    }

    //打印v的地址
    cout << "&v:" << &v << endl;
    //打印v[i]的地址(即第一层vector的地址)
    cout << "&v[i]:" << endl;
    for (int i = 0; i < 2; i++)
    {
        cout << &v[i] << endl;
    }
    //打印v的所有元素的地址
    cout << "&v[i][j]:" << endl;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cout << &v[i][j] << " ";
        }
        cout << endl;
    }
    cout << "----------------------------------------" << endl;
    //打印v的各元素值
    
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0;j < 3;j++)
        {
            cout << v[i][j] << " ";
        }
        cout << endl;
    }

    function1(v);
    function2(v);
    function3(&v);
    return 0;
}
View Code

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

 转载:http://www.cnblogs.com/xiaoxi666/p/6843211.html

标签:std,function1,cout,vector,三种,内存,vec
From: https://www.cnblogs.com/kongyijin/p/17399564.html

相关文章

  • 5-1liunx虚拟机内存分配
    一、虚拟机硬件配置1.CPU:2核或更多2.内存:1G以上,推荐2G。3.硬盘:一块硬盘,200G。4.网卡:NAT模式。5.光盘:挂载对应版本的ISO文件。二、ISO下载地址:Centos http://mirrors.aliyun.com http://mirrors.sohu.com http://mirrors.163.comUbuntu https://cdimage.ubuntu.com......
  • 数据结构-二维数组内存结构
    二维数组内存结构  逻辑上是二维的,再分配内存的时候,也是给他分配一维的内存行优先存储 行优先存储,M行N列的b[i][j]的存储地址=基地址+(i*N+j)*sizeof(ElemType)列优先存储 M行N列b[i][j]的存储地址=基地址+(j*M+i)*sizeof(ElemType)......
  • string传递内存参数
    使用string作为函数参数内存的输入使用string传递和获取内存不需要考虑内存释放在C++中,使用std::string类型进行字符串的传递和获取不需要显式考虑内存释放的原因是,std::string类实现了自动内存管理。std::string类封装了对字符串内存的分配和释放操作,它负责在构......
  • MATLAB代码:全面ADMM算法代码,实现了三种ADMM迭代方式
    MATLAB代码:全面ADMM算法代码,实现了三种ADMM迭代方式关键词:综合能源分布式协同优化交替方向乘子法最优潮流参考文档:《基于串行和并行ADMM算法的电_气能量流分布式协同优化_瞿小斌》仿真平台:MATLAB主要内容:本代码是较为全面的ADMM算法代码,实现了三种ADMM迭代方式,分别是:1、普通常......
  • 操作系统:为什么一个页表项通常占用1Byte,1字节呢?页表项≠逻辑地址!常见OS内存管理误区辨
    为什么一个页表项通常占用1Byte,1字节呢?页表项≠逻辑地址!如果还不懂,请看:页目录、页表和页三者的关系详解每个页表项占用一个字节是怎么来的?问题启发一开始是做题的时候,为什么不是2^12bit,而是2^12Byte某计算机主存按节址,逻地址和物理地址都是32位页表项大小为4B。请回......
  • 基于模型预测mpc的三种路径跟踪,三个仿真,超车轨迹,蛇形轨迹,直线轨迹,仿真运行稳定,控制量
    基于模型预测mpc的三种路径跟踪,三个仿真,超车轨迹,蛇形轨迹,直线轨迹,仿真运行稳定,控制量变化平滑自然,绝对好用。。图片可以放大细看,跟踪效果良好ID:45200682395903590......
  • 一道vector的题,超时
    “单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。输入格式:输入第一行给出一个正整数N(≤ 50000),是已知夫妻/伴侣的对数;随后N行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个ID号,为5位数字(从00000......
  • vector和string的转化
    C99:int数字_t,t表示它是取另一个名字,不是新的数据类型uint数字_t表示无符号,编译器把这种数据类型看成数字。数字是指单位长度有多少bit1.string转vector<char>用assignstring与数字转化strings=“hellloword!”vector<uint8_t>v;v.assign(s.begin(),s.end()); 2......
  • 三菱FX3U-485ADP-MB通讯三种变频器程序 已实现测试的变频器:施
    三菱FX3U-485ADP-MB通讯三种变频器程序已实现测试的变频器:施耐德ATV312,三菱E700,台达VFD-M三款变频器,支持rtu的协议的变频器都可实现。需要硬件:FX3UPLC,FX3U-485ADP-MB通信扩展模块,施耐德ATV312变频器或台达vfd-m变频器或三菱E700变频器,fx3u-cnv-bd。通过modbusrtu通讯方式,可......
  • Java 内存模型
    java虚拟机将内存区域划分为:方法栈本地方法栈堆程序计数器方法区其中,堆和方法区是线程共有的,其他都是每个线程私有的。程序计数器用于记录指令执行位置,以便线程正常切换方法栈和本地方法栈则是执行函数时存放的临时变量(变量的引用,即便是函数中生成的对象,也是存放在堆中......