STL Vector push_back()

时间:2017-01-07 15:15:02

标签: c++ vector stl

我找到了以下示例。我之前没有使用过STL,我想了解它在做什么

#include <stdio.h>
#include <vector>
using namespace std;
#define maxn 100010

int N, M, L, Start;
vector <int> A[maxn];

int main()
{
    int i, x, y;
    scanf("%d %d %d ", &N, &M, &Start);

    for (i = 1; i <= M; i++) 
    {
        scanf("%d %d ", &x, &y);
        A[x].push_back(y);
    }

return 0;
}

我在谈论 A [x] .push_back(y); 。从我在documentation中看到的,它在向量的末尾添加了一个新元素,并将向量大小增加了一个。由于我正在阅读一对数字(x,y),这意味着在每次 x 读取后会有一个 y ?所以最后我的矢量会像[x] [y] [x'] [y'] [x''] [y'']那样?

1 个答案:

答案 0 :(得分:0)

  

因为我正在阅读一对数字(x,y),这是否意味着在每次读取x后都会有一个y?

不,它没有。用户可以输入非整数,例如&#34; fubar&#34;并导致scanf失败。没有测试scanf失败,因此程序可能会接受没有y的x。

scanf返回成功读取的输入数,所以

if (scanf("%d %d ", &x, &y) == 2)
{
    A[x].push_back(y);
}
else
{
    // Inform user of error
}

会捕捉到简单的错误。

  

所以最后我的矢量会像[x] [y] [x&#39;] [y&#39;] [x&#39;&#39;] [y&#39;&#39 ]

ypush_back,不用作索引,而不是

[x][y][x'][y'][x''][y'']

A看起来更像

[x][0] == y
[x'][0] == y'
[x''][0] == y''

任何A[i],其中没有提供x,y对为空vector。为了使示例简单,请考虑输入3 3 3 3 5 7

[0][0] == out of range access. undefined behaviour
[1][0] == out of range access. undefined behaviour
[2][0] == out of range access. undefined behaviour
[3][0] == 3
[3][1] == 3
[3][2] == out of range access. undefined behaviour
[4][0] == out of range access. undefined behaviour
[5][0] == 7
[5][1] == out of range access. undefined behaviour
[6][0] == out of range access. undefined behaviour
[7][0] == out of range access. undefined behaviour
...
[10010][0] == out of range access. undefined behaviour

获得

[x][y][x'][y'][x''][y'']

我怀疑你需要实现稀疏数组数据结构,但我不确定。一个穷人的解决方案是使用std::map std::map s:

std::map<int,std::map<int,UNKNOWN_DATATYPE> A;