jot*_*asi 6 c++ stdvector c++11
我有std::vector一些数据(在我的情况下是点),我想循环遍历所有不同的元素对.对的顺序并不重要(因为我只对点的距离感兴趣).使用经典for循环,我想要做的是:
std::vector<double> vec{-1., 3., 5., -8., 123., ...};
for (std::vector<double>::size_type first = 0; first < vec.size(); ++first) {
for (std::vector<double>::size_type second = first+1; second < vec.size();
++second) {
// Compute something using std::fabs(vec.at(first)-vec.at(second))
}
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,如果使用基于范围的循环可以更优雅地实现这一点.
我不会试图将它强制转换为基于范围的循环(因为设计内部循环的开始会很棘手),但我会直接使用迭代器来阐明循环体并使代码较少依赖于特定的您正在使用的容器:
for (auto first = vec.begin(); first != vec.end(); ++first){
for (auto second = first + 1; second != vec.end(); ++second){
// Your vec.at(first) is now simply *first.
}
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是first + 1总是有效的,因为first是从来没有vec.end()的时候first + 1进行评估。
std::vector::atC++ 标准还要求检查提供的索引是否在向量的范围内(std::out_of_range如果不在范围内则抛出异常),这在您的情况下是不必要的开销。
| 归档时间: |
|
| 查看次数: |
518 次 |
| 最近记录: |