为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
宝慕林4294392 2019-11-04 14:28:47
在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如果使用不正确,变量可能很危险,所以-这是正确的吗?
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

向后迭代

看到这个答案。


迭代转发

这几乎是相同的。只需按增量更改迭代器/交换递减量即可。您应该更喜欢迭代器。有人告诉您将其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) {

    /* std::cout << *it; ... */

}

重要的是,对于您不知道其定义的迭代器,请始终使用前缀增量形式。这将确保您的代码尽可能地通用。


使用范围C ++ 11

for(auto const& value: a) {

     /* std::cout << value; ... */

使用索引

for(std::vector<int>::size_type i = 0; i != v.size(); i++) {

    /* std::cout << v[i]; ... */

}

使用数组

使用迭代器

for(element_type* it = a; it != (a + (sizeof a / sizeof *a)); it++) {

    /* std::cout << *it; ... */

}

使用范围C ++ 11

for(auto const& value: a) {

     /* std::cout << value; ... */

使用索引

for(std::size_t i = 0; i != (sizeof a / sizeof *a); i++) {

    /* std::cout << a[i]; ... */

}

但是,请阅读向后迭代的答案,该sizeof方法可以解决什么问题。


查看完整回答
反对 回复 2019-11-04
?
largeQ

TA贡献2039条经验 获得超7个赞

在您的示例的特定情况下,我将使用STL算法来完成此操作。


#include <numeric> 


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 );


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 769 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信