在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如果使用不正确,变量可能很危险,所以-这是正确的吗?

约翰尼斯·绍布-Litb

对于向后迭代,请参见此答案

向前迭代几乎是相同的。只需按增量更改迭代器/交换递减量即可。您应该更喜欢迭代器。有人告诉您将其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方法可以解决什么问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: vector :: resize()与std :: vector :: reserve()

std :: dynarray与std :: vector

获取std :: vector的迭代器索引的最有效方法是什么?

为什么带有无符号long long参数的std :: bitset构造函数未标记为显式?

std :: vector构造函数,带有一对迭代器

随后在多个std容器上进行迭代

错误C4592:符号将被动态初始化。VS2015.1静态const std :: vector字段

std :: tuple vs std :: array作为std :: vector的项

std :: vector :: insert vs std :: list :: operator []

返回带有std :: move的std :: vector

std :: vector :: size返回一个int类型或无符号int

如何管理std :: vector的std :: vector

没有调试符号的GDB打印stl(例如std :: vector)

C ++性能std :: array vs std :: vector

为什么在std :: set上进行迭代比在std :: vector上进行迭代慢得多?

std :: vector <int>到std :: vector <enum>

如何std :: variant <无符号长,size_t,无符号整数>

将std :: vector <std :: vector <std :: string >>转换为std :: vector <std :: vector <double >>

在std :: vector <std :: pair <T,U>>对象上以排序方式进行迭代

如何在std :: set上进行迭代时删除元素

C ++ std :: vector <std :: string>迭代器segfaults

std :: vector <std :: vector <T >>的迭代器有效性

std :: vector的std :: vector的比较函数

在std :: unordered_map <int,std :: vector <Element >>上进行迭代的迭代器

对std_logic_vector进行位移位,同时保持精度并转换为有符号

在 std::vector 中索引名称

从 Go 中迭代 `std::vector<std::string>`?

2 的补充 std_logic_vector 到无符号数

std::sort() 算法对 std::list 的 std::vector 进行排序的效率