C++ 打印向量对时未获取输入值
我想给一对向量加一对。 当我打印向量元素时,我不会得到我输入的整数。 请帮忙C++ 打印向量对时未获取输入值,c++,C++,我想给一对向量加一对。 当我打印向量元素时,我不会得到我输入的整数。 请帮忙 #include<iostream> #include<vector> #include<utility> using namespace std; int main() { vector<vector<unsigned long int> >matrix; vector&
#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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
向量矩阵;
向量机;
int L;
cin>>L;
int n1,n2;
pmat.resize(L);
对于(int k=0;k>n1>>n2;
对p=形成对(n1,n2);
cout由于您使用的是pmat.resize(L)
和L次pmat.push_back(…)
,因此最终在向量中存储了2*L项。但是,您只打印了前半部分,即索引0到L-1。所需的值从索引L存储到2*L-1
只需将pmat.resize(L)
更改为pmat.reserve(L)
或者,您可以使用调整大小(L)
,但要最终得到L
条目,您需要将每个输入对存储到pmat[k]
,因此您可以编写pmat[k]=p;
根据经验,如果您知道要添加多少元素,我建议使用reserve
+push_-back
方法。原因是resize
初始化元素,而reserve只是断言将有足够的空间,并且在任何后续的push_-back操作中都不需要重新分配。 由于您使用的是pmat.resize(L)
和L次pmat.push_back(…)
,因此最终在向量中存储了2*L个条目。但是,您只打印了前半部分,即索引0到L-1。所需的值从索引L存储到2*L-1
只需将pmat.resize(L)
更改为pmat.reserve(L)
或者,您可以使用调整大小(L)
,但要最终得到L
条目,您需要将每个输入对存储到pmat[k]
,因此您可以编写pmat[k]=p;
根据经验,如果您知道要添加多少元素,我建议使用reserve
+push_-back
方法。原因是resize
初始化元素,而reserve只是断言将有足够的空间,并且在任何后续的push_-back操作中都不需要重新分配。 方法1:
删除此行:
pmat.resize(L);
您不需要像在添加之后那样首先调整它的大小
方法2:
更改以下行
pmat.push_back(p);
到
首先可以执行resize()
,但在此之后,添加时不应使用push_back()
,只需使用pmat[k]=p
PS:你不应该把这两种方法混在一起。始终坚持使用其中一种方法。方法1:
删除此行:
pmat.resize(L);
您不需要像在添加之后那样首先调整它的大小
方法2:
更改以下行
pmat.push_back(p);
到
首先可以执行resize()
,但在此之后,添加时不应使用push_back()
,只需使用pmat[k]=p
PS:您不应该将这两种方式混在一起。始终一致地使用其中一种方式。您不希望在分配对后添加更多对。您现在可以直接访问它们。
只需使用pmat[k]=p;
而不是pmat。向后推(p);
分配对后,您不想添加更多对。您现在可以直接访问它们。
只需使用pmat[k]=p;
而不是pmat。向后推(p);
如果在读取值后打印向量的大小,您会注意到程序有一个小问题:
./test
2
1 2
12
3 4
34
Size of the vector: 4
0,0 0,0
嗯?虽然我只输入了2对,但向量的大小是4。这是怎么发生的
如果你看这张照片,上面写着
调整容器大小以包含count元素
因此,即使在您读取任何值之前,您的向量将已经包含2个元素!这些元素将是默认构造的,因此为0。当您随后push_pack
您读取的元素时,这些元素将到达向量中的索引2和3,因此结束向量的元素数量是您想要的两倍(在本例中为4个).只打印前半部分,即零值
解决方案是使用resize而不是resize,resize不创建元素,只为元素保留空间,或者只是删除resize调用。但是使用reserve更有效,因为这样向量只需要分配一次内存。如果在读取值后打印向量的大小,您会注意到一个小提示您的程序存在的问题:
./test
2
1 2
12
3 4
34
Size of the vector: 4
0,0 0,0
嗯?虽然我只输入了2对,但向量的大小是4。这是怎么发生的
如果你看这张照片,上面写着
调整容器大小以包含count元素
因此,即使在您读取任何值之前,您的向量将已经包含2个元素!这些元素将是默认构造的,因此为0。当您随后push_pack
您读取的元素时,这些元素将到达向量中的索引2和3,因此结束向量的元素数量是您想要的两倍(在本例中为4个).只打印前半部分,即零值
解决方案是使用resize而不是resize,resize不创建元素,只为元素保留空间,或者删除resize调用。但是使用reserve更有效,因为这样向量只需要分配一次内存。pmat.resize(L);
如果向量为空,它将初始化大小为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);
}
用于(int k=0;k>n1>>n2;
对p=形成对(n1,n2);
coutpmat.resize(L);
电磁脉冲中的中频矢量