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<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 的值不正确的主要内容,如果未能解决你的问题,请参考以下文章