使用size_t值和边界条件编写递减循环的“正确”方法是什么。示例不正确的实现:
for (size_t elemNum = listSize-1; elemNum >= 0; --elemNum) { /* ... */ }
当它达到零时,它将回绕到最大值而不是作为边界条件。反向迭代循环是必要的。这似乎是一个问题,可能有一个事实上的标准解决方案,但我找不到它是什么。
答案 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_type
是list
的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]`
}