-2

当我这样做时,为什么会出现“分段错误(核心转储)”:

std::vector<std::pair<int,int> > hm;
hm[0] = pair<int,int> (1,1);
4

4 回答 4

6

该向量不包含索引为零的元素,它只是空的。您应该添加一个新项目:

hm.push_back(pair<int,int>(1,1));
于 2013-07-04T20:19:01.657 回答
2

此向量的初始大小为 0,operator[]并且不检查边界。您需要使用该push_back方法(它会自动为您将向量的大小增加 1,并且大小是指元素的数量)或使用构造函数重载之一为向量赋予初始大小,如下所示:

std::vector<std::pair<int, int>> hm(5);

或者用resize方法。

于 2013-07-04T20:19:43.897 回答
1

当你写

std::vector<std::pair<int,int> > hm;

您正在创建一个向量,它不包含任何元素。在下一行,

hm[0] = std::pair<int,int> (1,1);

您正在尝试分配给该向量的第一个元素而没有元素,这是未定义的行为(并且在您的系统上恰好导致分段错误,至少在您尝试的情况下)。如果您想在运行时捕获此类错误,可以使用at,如

hm.at(0) = std::pair<int,int> (1,1);

但是,您以这种方式获得的唯一结果是异常而不是未定义的行为,这并不能解决根本问题,即您访问的对象根本不存在。

现在有几种方法可以创建该对象:

首先,您可以使用“按需”创建它push_back

hm.push_back(std::pair<int,int> (1,1));

这会导致向量在末尾附加一个对象(因为向量最初是空的,所以这是之后唯一的元素,因此hm[0],并使用您传递给push_back.

另一种方法是从头开始给出向量元素:

std::vector<std::pair<int,int> > hm(1);
hm[0] = std::pair<int,int> (1,1);

这里构造时的参数告诉向量立即创建(并默认初始化)一个元素。由于现在有第一个元素,您可以毫无问题地分配给它。但是请注意,默认初始化会消耗一些性能,并且可能不适用于某些类型。

在特定情况下,您还可以观察到所有元素都是相等的(因为只有一个),因此您可以在此处使用双参数构造函数:

std::vector<std::pair<int,int> > hm(1, std::pair<int,int> (1,1));

在不相关的注释中:std::pair<int, int>您可以使用std::make_pair并保存自己明确提及类型。

于 2013-07-05T21:23:56.520 回答
0

如果你真的想让[]行为像 Python 和 Ruby 一样,那么在前面hm[i] = j加上if (hm.size() < i+1) { hm.resize(i+1); }.

于 2014-02-25T20:36:06.453 回答