使用c 中的max_element()和min_element()进行分割故障



当我尝试运行此程序时,会在本节中引起的分段故障:

      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;

仍然困扰着我的一件事:复制构造函数不应该完成所有这些吗?

相关内容

  • 没有找到相关文章