在std :: vector上进行迭代:无符号vs有符号索引变量

在C ++中迭代向量的正确方法是什么?


考虑下面的两个代码片段,这一段效果很好:


for (unsigned i=0; i < polygon.size(); i++) {

    sum += polygon[i];

}

还有这个:


for (int i=0; i < polygon.size(); i++) {

    sum += polygon[i];

}

产生warning: comparison between signed and unsigned integer expressions。


我是C ++世界的新手,所以unsigned变量对我来说有点吓人,我知道unsigned如果使用不正确,变量可能很危险,所以-这是正确的吗?


宝慕林4294392
浏览 770回答 3
3回答

阿波罗的战车

向后迭代看到这个答案。迭代转发这几乎是相同的。只需按增量更改迭代器/交换递减量即可。您应该更喜欢迭代器。有人告诉您将其std::size_t用作索引变量类型。但是,这不是便携式的。始终使用size_type容器的typedef(虽然在向前迭代的情况下只能进行一次转换,但是在使用时std::size_t,如果向后迭代的情况下它可能会出错,以防万一std::size_t大于typedef的情况size_type) :使用std :: vector使用迭代器for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {&nbsp; &nbsp; /* std::cout << *it; ... */}重要的是,对于您不知道其定义的迭代器,请始终使用前缀增量形式。这将确保您的代码尽可能地通用。使用范围C ++ 11for(auto const& value: a) {&nbsp; &nbsp; &nbsp;/* std::cout << value; ... */使用索引for(std::vector<int>::size_type i = 0; i != v.size(); i++) {&nbsp; &nbsp; /* std::cout << v[i]; ... */}使用数组使用迭代器for(element_type* it = a; it != (a + (sizeof a / sizeof *a)); it++) {&nbsp; &nbsp; /* std::cout << *it; ... */}使用范围C ++ 11for(auto const& value: a) {&nbsp; &nbsp; &nbsp;/* std::cout << value; ... */使用索引for(std::size_t i = 0; i != (sizeof a / sizeof *a); i++) {&nbsp; &nbsp; /* std::cout << a[i]; ... */}但是,请阅读向后迭代的答案,该sizeof方法可以解决什么问题。

largeQ

在您的示例的特定情况下,我将使用STL算法来完成此操作。#include <numeric>&nbsp;sum = std::accumulate( polygon.begin(), polygon.end(), 0 );对于更一般但仍然非常简单的情况,我将使用:#include <boost/lambda/lambda.hpp>#include <boost/lambda/bind.hpp>using namespace boost::lambda;std::for_each( polygon.begin(), polygon.end(), sum += _1 );
打开App,查看更多内容
随时随地看视频慕课网APP