我找到了以下示例。我之前没有使用过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'']那样?
答案 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 ]
y
为push_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;