V2的值并非正确

the values of v2 is not coming out to be correct

本文关键字:V2      更新时间:2023-10-16

我正在尝试显示v2的值。如果运行代码,则可以看到V2的第一个值是正确的,但是第二个值只是对第一个值的重复。我已经使用了向量的向量作为我的代码。我在这里与列矢量打交道。如果您能让我知道我的错误,我会很感激。

    #include <iostream>
    #include <vector>
using namespace std;
vector<vector<int> > set_val(int M)
{
    vector<vector<int> > v1(M, vector<int> (1));
    for(int i=0;i<M;i++)
    {
        for(int j=0;j<1;j++)
        {
            cin>>v1[i][j];
        }
    }
    return v1;
}
vector<vector<int> > cal_val(int M, vector<vector<int> > &v1)
{
    vector<vector<int> > v2;
    vector<int> temp;
    for(int i=0;i<M;i++)
    {
        for(int j=0;j<1;j++)
        {
            temp.push_back(v1[i][j]-1);
        }
        v2.push_back(temp);
    }
    //display v2
    for(int i=0;i<M;i++)
    {
        for(int j=0;j<1;j++)
        {
            cout<<"v2["<<i<<"]["<<j<<"]:  "<<v2[i][j]<<endl;
        }
    }
    return v2;
}
int main()
{
    int M;
    cout<<"Enter data: ";
    cin>>M;
    vector<vector<int> > v1(M, vector<int> (1));
    vector<vector<int> > v2(M, vector<int> (1));
    v1=set_val(M);
    v2=cal_val(M,v1);
    return 0;
}

cal_val函数中的线 for(int j=0;j<1;j++)中,我推断出您希望 v2也是每个都有大小 1的向量的向量。因此,我认为在代码的这一部分中添加temp.clear();

for(int i=0;i<M;i++)
{
    temp.clear();
    for(int j=0;j<1;j++)
    {
        temp.push_back(v1[i][j]-1);
    }
    v2.push_back(temp);
}

应该解决问题。原因是否则,您将反复附加到temp,因此它将不再具有尺寸1,请注意,您通常不应该传递向量的向量的副本,但是您应该将它们作为参考或使用来传递。移动语义。

此外,我不同意其他一些答案,这些答案主张在for循环的每个迭代中创建一个新的temp对象。这是因为clear()比创建对象要快(您避免通过每个循环中的强制器/破坏者,并且也不会分配尽可能多的内存,请参阅此问题。有关该主题的讨论(。

您需要在每个循环中制作新的temp矢量。更改

vector<vector<int> > v2;
vector<int> temp;
for(int i=0;i<M;i++)
{
    for(int j=0;j<1;j++)
    {
        temp.push_back(v1[i][j]-1);
    }
    v2.push_back(temp);
}

to

vector<vector<int> > v2;
for(int i=0;i<M;i++)
{
    vector<int> temp; //<--- moved here
    for(int j=0;j<1;j++)
    {
        temp.push_back(v1[i][j]-1);
    }
    v2.push_back(temp);
}

请不要混合您的代码并将其简化为可读性。

您可以在主循环中创建向量,并将其作为&amp; v1传递到set_val作为参数。例如,将其填充并返回错误代码。

不要以1个简单使用v1 [i] [0]。

的写入循环

将v2作为参数&amp; v2传递到calc_val,然后像v2 [i] [0] = v1 [i] [0] - 1。删除温度向量。

例如

#include <iostream>
#include <vector>
using namespace std;
int set_val(
   int M,
   vector< vector<int> > &v1
) {
    if(M <= 0) {
        return -1;
    }
    for(int i = 0; i < M; i++) {
       cout << "Enter value for v1[" << i << "][0] : ";
       cin >> v1[i][0];
    }
    return 0;
}
int calc_val(
    int M, 
    vector< vector<int> > &v1,
    vector< vector<int> > &v2
) {
    if (M <= 0) {
        return -1;
    }
    for(int i = 0; i < M; i++) {
        v2[i][0] = v1[i][0] - 1;
    }
    for(int i = 0; i < M; i++) {
        cout << "v2[" << i << "][0] = " << v2[i][0];
    }
    return 0;
}
int main()
{
    int M;
    cout << "Enter size of vector  : "; 
    cin >> M;
    vector< vector<int> > v1(M, vector<int> (1));
    vector< vector<int> > v2(M, vector<int> (1));
    int ret = set_val(M, v1);
    if (ret == -1) {
       cout << "Parameter M error.";
    } else {
       ret = calc_val(M, v1, v2);
       if (ret == -1) {
           cout << "Parameter M error.";
       }
    }
    return 0;
}

如果这起作用,则可以将其扩展以支持多个向量维度。

相关文章:
  • 没有找到相关文章