当我尝试运行此程序时,会在本节中引起的分段故障:
std::vector<double> dist1(dist);
dist1.erase(std::remove(dist1.begin(), dist1.end(), 0), dist1.end());
max = *std::max_element(dist1.begin(),dist1.end());
min = *std::min_element(dist1.begin(),dist1.end());
是MAX_ELEMENT()和min_element()的使用导致分割故障,但我不明白为什么。我在这里做的是将矢量" dist"复制到" dist1",删除了新矢量中的所有" 0",然后搜索从" dist" max"one_answers" min中的其余项目中查找最低和最大值"是先前声明的双重变量。以前称为" dist"为
std::vector<double> dist; //vector used to hold the distances between adjacent vertices
dist.resize(size);
该代码在Linux服务器上使用G 编译。请建议。
是Max_element()和min_element()的使用导致 分段故障,但我不明白为什么。
no,结果是结果的 dereferencing 导致分割故障。
如果您将这些功能与 empty 范围一起使用,则返回末端迭代器。任何试图解除迭代器的尝试都是不确定的行为。分割故障是不确定行为的典型但不是必要的结果。
您必须防止矢量为空(理想情况下为此添加断言)或更改程序逻辑以支持空矢量。
选项1:
// code that prevents dist1 from being empty goes here
// ...
auto const max_iter = std::max_element(dist1.begin(), dist1.end());
assert(max_iter != dist1.end());
auto const max = *max_iter;
选项2:
auto const max_iter = std::max_element(dist1.begin(), dist1.end());
if (max_iter == dist1.end())
{
// do something to handle the special situation
}
else
{
auto const max = *max_iter;
// normal program flow
}
在应用 emove/erase 操作后,很可能是空的。
在空输入间隔std :: min_element和std :: max_element返回输入范围的末端。结果,您尝试解释 dist1.end()并发生崩溃。
我找到了一种使它起作用的方法。而不是仅使用复制构造函
std::vector<double> dist1(dist)
我还声明并调整了我的新向量,如下所示:
std::vector<double> dist1(size);
dist1=dist;
仍然困扰着我的一件事:复制构造函数不应该完成所有这些吗?