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

电磁脉冲中的中频矢量