向量

时间:2015-12-04 22:16:12

标签: c++ vector iterator

我正在尝试在向量中找到最小的非零距离。所以我使用下面的代码

vector<double> smallest_dist; 
for (int i = 0; i < dist.size(); i++) {
    while (dist.at(i) > 0){
        smallest_dist.push_back(dist.at(i));
    }
}
auto smallest = std::min_element(std::begin(smallest_dist), std::end(smallest_dist));
std::cout<<"smallest"<<*smallest<<endl;
cout<<"\n\n\n";

我浏览一个向量,其中列出的距离为零,只要它们大于0,就会将i的距离推回到新的向量smallest_dist;

然后我尝试使用std::min_element来找到双向量中的最小元素。

它给了我一个迭代器错误。有人能帮助我吗?

2 个答案:

答案 0 :(得分:2)

作为

while (dist.at(i) > 0){
    smallest_dist.push_back(dist.at(i));
}
如果在dist中实际存在大于0的某个元素,那么

将是一个无限循环,但是您确实到达了输出代码,我们可以得出smallest_dist为空的结论。

因此,std::min_element将返回std::end(smallest_dist),您无法取消引用该内容。

相反,while应为if,并且对std::min_element的调用之前应进行一些错误检查,断言smallest_dist不为空。

备注:您实际上并不需要手工制作的循环,您可以使用std::copy_ifstd::back_inserter收集所有积极因素:

std::vector<double> smallest_dist;
std::copy_if(std::begin(dist), std::end(dist),
    std::back_inserter(smallest_dist), [](const auto &v){return v > 0;});

if (smallest_dist.empty()) {
    // No distance greater than 0, do error handling
}

答案 1 :(得分:1)

你有一个无限循环。将while替换为if