【问题标题】:C++ : Using a int pointer to point to a vector created inside a functionC++:使用 int 指针指向在函数内部创建的向量
【发布时间】:2020-03-07 20:08:43
【问题描述】:

我仍在完善在这里发帖的艺术,所以请耐心等待,我会编辑和修复任何建议!

我有一个作业要求我创建操作向量的函数。 “catch”是传递给函数的所有数据都是通过引用这个结构来传递的:

struct Vector { // this struct must stay as is
    int sze = 0; // "size" took out i for compatability
    int capacity = 0;
    int * data = nullptr ;
}a,b,c;

void construct_vector ( Vector& v, int size= 0, int initVal= 0);

我遇到的问题出在函数construct_vector() 中,你猜对了,我必须构造一个向量并使用int* data 指向堆上的向量?我对最后一部分并不积极)。我只知道我必须使用 int 指针指向在构造函数中创建的向量,并且我一生都无法弄清楚如何做到这一点。

我正在尝试的示例:

void construct_vector ( Vector &v, int size, int initVal){

    std::vector<int> t(size,initVal);
    *v.data = &t ; // ERROR: Assigning to 'int' from incompatible type 'std::vector<int> *'
    v.capacity = size; //
    v.sze = size;

    for (int i=0; i < t.size(); i++){
        /* I originally tried to implement a
        dynamic int pointer here but I cannot change int* data
        to int*data[sze] within the struct*/
    }
}

int * data之所以必须指向向量,是因为数据是通过引用结构成员v传递给后续函数的:

void destroy_vector ( Vector & v );
void copy_data ( Vector & v );

编辑:我的问题是我误解了我的任务目标,但我认为我收到的答案真的可以帮助人们理解动态内存以及它应该如何在函数中使用。所以我要保持原样!

【问题讨论】:

  • 我认为你不应该使用std::vector,而是自己复制它的功能。
  • 如果你希望数组/向量在函数之后存在,它必须在堆上声明。不知道为什么你在这里有一个本地向量。为什么不直接做v.data = new int[size]

标签: c++ pointers vector struct dynamic-memory-allocation


【解决方案1】:

这里有两个问题:

std::vector<int> t(size,initVal); 
*v.data = &t ; // ERROR: Assigning to 'int' from

首先,*v.data&amp;t是不同的类型,一种是int,另一种是指向vectorvector的指针。

你可以编译它(但你不应该,看第二个问题)

v.data = t.data();

另一个问题是vector 是函数的局部变量。一旦函数返回,你的指针就会悬空。

因此,解决您的问题的正确方法是使用动态数组:

v.data = new int[size];

使用完后别忘了在结构体的析构函数中delete[]

delete [] data;

【讨论】:

    【解决方案2】:

    代替

    std::vector<int> t(size,initVal);
    *v.data = &t ;
    

    你需要

    v.data = new int[size];
    

    要使用输入值填充对象,请使用

    for ( int i = 0; i < size; ++i )
    {
       v.data[i] = initVal;
    }
    

    您可以使用std::fill 使您的代码更简单。

    std::fill(v.data, v.data+size, initVal);
    

    当您自己管理动态内存时,请务必关注The Rule of Three

    【讨论】:

    • 不会将循环的最后一次迭代放在“v.data”中,因为在结构 v.data 中 int 指针不是 int[i] * 数据?
    • @StoneCodeStawny,这是一个错字。现在已经修好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多