v2 的值不正确

Posted

技术标签:

【中文标题】v2 的值不正确【英文标题】:the values of v2 is not coming out to be correct 【发布时间】:2018-04-01 10:09:04 【问题描述】:

我正在尝试显示 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;

【问题讨论】:

请描述你的代码应该做什么 【参考方案1】:

cal_val 函数中的for(int j=0;j&lt;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() 将比创建对象更快(您避免在每个循环中使用构造函数/析构函数,也不会分配尽可能多的内存,有关该主题的讨论,请参阅 this question)。

【讨论】:

它已修复。谢谢你:)【参考方案2】:

您需要在每个循环中创建新的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);

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);

【讨论】:

【参考方案3】:

请不要混淆您的代码并简化它以提高可读性。

你可以在主循环中创建你的向量并将它也作为 &v1 传递给 set_val 作为参数。例如,在此处填充并返回错误代码。

不要编写大小为 1 的循环,简单地使用 v1[i][0]。

将 v2 作为参数 &v2 传递给 calc_val 和 calc,如 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;

如果可行,您可以扩展它以支持多个向量维度。

【讨论】:

以上是关于v2 的值不正确的主要内容,如果未能解决你的问题,请参考以下文章

循环和结构数组时打印的值不正确

memset 设置的值不正确

PHP:分配后的值不正确

如果接收到的值不匹配,则解码字典正确

为啥我的 Access-Control-Allow-Origin 标头的值不正确?

Fortran Mex 文件 - 传回 Matlab 的值不正确