当我这样做时,为什么会出现“分段错误(核心转储)”:
std::vector<std::pair<int,int> > hm;
hm[0] = pair<int,int> (1,1);
当我这样做时,为什么会出现“分段错误(核心转储)”:
std::vector<std::pair<int,int> > hm;
hm[0] = pair<int,int> (1,1);
该向量不包含索引为零的元素,它只是空的。您应该添加一个新项目:
hm.push_back(pair<int,int>(1,1));
此向量的初始大小为 0,operator[]
并且不检查边界。您需要使用该push_back
方法(它会自动为您将向量的大小增加 1,并且大小是指元素的数量)或使用构造函数重载之一为向量赋予初始大小,如下所示:
std::vector<std::pair<int, int>> hm(5);
或者用resize
方法。
当你写
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
并保存自己明确提及类型。
如果你真的想让[]
行为像 Python 和 Ruby 一样,那么在前面hm[i] = j
加上if (hm.size() < i+1) { hm.resize(i+1); }
.