我想在一对矢量中添加一对。 当我打印矢量元素时,我没有得到我输入的整数。 请帮忙。
#include<iostream>
#include<vector>
#include<utility>
using namespace std;
int main()
{
vector<vector<unsigned long int> >matrix;
vector<pair<int,int> >pmat;
int L;
cin>>L;
int n1, n2;
pmat.resize(L);
for(int k = 0; k<L; k++)
{
cin>>n1>>n2;
pair<int,int> p = make_pair(n1,n2);
cout<<p.first<<p.second<<endl;
pmat.push_back(p);
}
for(int k = 0; k<L; k++)
{
cout<<pmat[k].first<<','<<pmat[k].second<<' ';
}
cout<<endl;
return 0;
}
答案 0 :(得分:2)
由于您正在使用pmat.resize(L)
和L次pmat.push_back(...)
,因此您最终在向量中存储了2 * L个条目。但是,您只打印上半部分,索引0到L - 1.您想要的值从索引L存储到2 * L - 1.
只需将pmat.resize(L)
更改为pmat.reserve(L)
。
或者,您可以使用resize(L)
,但要以L
条目结尾,您需要将每个输入对存储到pmat[k]
,因此您编写pmat[k] = p;
。
根据经验,如果您知道要添加的元素数量,我建议您使用reserve
+ push_back
方法。原因是,resize
初始化元素,而保留只是声明将有足够的空间,并且任何后续的push_back都不需要重新分配。
答案 1 :(得分:2)
方法1 : 删除这一行:
pmat.resize(L);
在您之后添加push_back()
时,您不需要首先调整它的大小。
方法2 : 更改以下行
pmat.push_back(p);
到
pmat[k] = p;
您可以首先resize()
,但在此之后,添加时不应使用push_back()
,只需使用pmat[k] = p
。
PS :你不应该混淆这两种方式。始终始终如一地使用其中一个。
答案 2 :(得分:1)
分配后,您不希望添加更多对。您现在可以直接访问它们。
只需使用pmat[k] = p;
代替pmat.push_back(p);
答案 3 :(得分:0)
如果在阅读完值后打印矢量大小,您会发现程序出现小问题:
./test
2
1 2
12
3 4
34
Size of the vector: 4
0,0 0,0
咦?即使我只输入了2对,向量的大小为4.这是怎么发生的?
如果你看documentation for resize,就说
调整容器大小以包含计数元素。
因此,即使在读取任何值之前,您的向量也已包含2个元素!那些将是默认构造的,因此为0.当你然后push_pack
读入的元素时,它们将落在向量中的索引2和3处,因此结束向量的元素是你想要的两倍(在这种情况下为4)。您只打印出前半部分,即零值。
解决方案是使用reserve而不是resize,它不会创建元素但只为它们保留空间,或者只是删除调整大小。但是使用reserve更有效,因为向量只需要分配一次内存。
答案 4 :(得分:0)
<强> pmat.resize(L); 强>
如果vector为空,它将初始化一个大小为L的向量pmat,然后将默认值赋给向量,所以现在pmat大小为L,默认值为
for(int k = 0; k<L; k++)
{
cin>>n1>>n2;
pair<int,int> p = make_pair(n1,n2);
cout<<p.first<<p.second<<endl;
pmat.push_back(p);
}
然后你将值推到pmat L次,所以最终的大小 2 * L
for(int k = 0; k<L; k++)
{
cout<<pmat[k].first<<','<<pmat[k].second<<' ';
}
这里你将从0读到L-1,它包含默认值,你可以看到从L-1到2L-1的值。 所以最后我要说的是使用reserve而不是resize 要么 pmat.resize(L);评论这一行