打印对的矢量时不获取输入值

时间:2013-12-31 17:06:00

标签: c++

我想在一对矢量中添加一对。 当我打印矢量元素时,我没有得到我输入的整数。 请帮忙。

    #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;
     }

5 个答案:

答案 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);评论这一行