当我这样做时,为什么会出现“Segmentation fault(core dumped)”:
std::vector<std::pair<int,int> > hm;
hm[0] = pair<int,int> (1,1);
答案 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); }
。