在C ++中将对分配给向量

时间:2013-07-04 20:17:17

标签: c++

当我这样做时,为什么会出现“Segmentation fault(core dumped)”:

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

此向量的初始大小为0,operator[]不检查边界。你需要使用push_back方法(它会自动地将向量的大小增加1,并且按大小我的意思是元素的数量)或者使用构造函数重载之一给向量一个初始大小像这样:

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

或使用resize方法。

答案 2 :(得分:0)

写作时

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],并使用您传递给{{1}的值初始化它}}

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

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>,而是明确提及类型。

答案 3 :(得分:0)

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