使用size_t 0作为边界条件进行迭代

时间:2011-08-28 22:27:33

标签: c++ c

使用size_t值和边界条件编写递减循环的“正确”方法是什么。示例不正确的实现:

for (size_t elemNum = listSize-1; elemNum >= 0; --elemNum) { /* ... */ }

当它达到零时,它将回绕到最大值而不是作为边界条件。反向迭代循环是必要的。这似乎是一个问题,可能有一个事实上的标准解决方案,但我找不到它是什么。

9 个答案:

答案 0 :(得分:18)

最简洁的方法是使用后增量:

for (size_t i = listSize; i--;) ...

答案 1 :(得分:6)

elemNum = listsize;
while (elemNum--) {
    /* work with elemNum varying from `listsize - 1` down to `0` */
}

答案 2 :(得分:4)

我不知道标准方式,但这应该有效:

for (size_t elemNum = listSize-1; elemNum < listSize; --elemNum) { /* ... */ }

答案 3 :(得分:2)

您可以使用两个变量:

size_t count = 0;
for (size_t elemNum = listSize-1; count < listSize; ++count, --elemNum) { /* ... */ }

答案 4 :(得分:2)

for (size_t counter = listSize; counter > 0; --counter) { 
     size_t index = counter-1;

    /* ... use `index` as an index ... */ 
}

答案 5 :(得分:2)

size_t elemNum = listSize;
while (elemNum > 0) {
    --elemNum;
    // Do your work here.
}

答案 6 :(得分:1)

您可以将此作为条件:

elemNum != (size_t)-1

或者你可以算数,并为你的索引做一些数学运算(编译器可能会优化出来):

for (size_t i = 1; i <= listSize; i++) {size_t elemNum = listSize-i; /* */}

答案 7 :(得分:0)

如果保证起始值不是太大,一个简单的答案就是:改为使用签名类型。

答案 8 :(得分:-1)

标准的C ++方式是使用std::reverse_iterator

在循环中,您正在访问列表的元素elemNum,例如通过list[elemNum],其中list为RandomAccessIterator概念建模。假设list_iterator_typelist的decltype。使用反向迭代器的循环变为:

std::reverse_iterator<list_iterator_type> it, end = std::reverse_iterator<list_iterator_type>(list);
for (it = std::reverse_iterator<list_iterator_type>(list + listSize); it != end; ++it) {
    // `*it` is `list[elemNum]`
}