检查 >=0 终止条件时的 for 循环索引类型
For loop index type when checking for >=0 termination condition
我需要通过字符串向后循环。
// std::string str assumed to be defined at this point
for (std::size_t i = str.length() - 1; i >= 0; i--) {
// perform some check on str[i]
}
问题描述
现在,如果我使用 int i
循环索引,这是可行的,因为 i 最终将变为 -1 并且循环终止。当对 运行 索引使用 std::size_t i
(无符号)时,当 "below" 为零时它将变得非常大,因此循环不会终止并最终导致分段错误。鉴于我想使用 std::size_t 作为循环索引类型,因为 std::string::length returns a std::size_t,而不是 int.[=14,因此解决此问题的首选方法是什么=]
可能的解决方案
for (std::size_t i = str.length(); i > 0; i--) {
// perform some check on str[i - 1]
}
我认为这真的很难看,因为我们将 i 用作 "offsetted" idx,这是不直观的。什么是干净的解决方案?
如果循环内不需要i
,可以使用反向迭代器:
int main()
{
std::string s = "Hello, World!";
for (std::string::reverse_iterator i = s.rbegin(); i != s.rend(); ++i)
std::cout << *i;
}
带有索引的更好的循环看起来像
for ( std::size_t i = str.length(); i != 0; i--) {
// perform some check on str[i-1]
// ^^^^^^^^
}
或者
for ( std::size_t i = str.length(); i-- != 0; ) {
// perform some check on str[i]
// ^^^^^^
}
也代替声明
std::size_t i = str.length();
你可以写
auto i = str.length();
我需要通过字符串向后循环。
// std::string str assumed to be defined at this point
for (std::size_t i = str.length() - 1; i >= 0; i--) {
// perform some check on str[i]
}
问题描述
现在,如果我使用 int i
循环索引,这是可行的,因为 i 最终将变为 -1 并且循环终止。当对 运行 索引使用 std::size_t i
(无符号)时,当 "below" 为零时它将变得非常大,因此循环不会终止并最终导致分段错误。鉴于我想使用 std::size_t 作为循环索引类型,因为 std::string::length returns a std::size_t,而不是 int.[=14,因此解决此问题的首选方法是什么=]
可能的解决方案
for (std::size_t i = str.length(); i > 0; i--) {
// perform some check on str[i - 1]
}
我认为这真的很难看,因为我们将 i 用作 "offsetted" idx,这是不直观的。什么是干净的解决方案?
如果循环内不需要i
,可以使用反向迭代器:
int main()
{
std::string s = "Hello, World!";
for (std::string::reverse_iterator i = s.rbegin(); i != s.rend(); ++i)
std::cout << *i;
}
带有索引的更好的循环看起来像
for ( std::size_t i = str.length(); i != 0; i--) {
// perform some check on str[i-1]
// ^^^^^^^^
}
或者
for ( std::size_t i = str.length(); i-- != 0; ) {
// perform some check on str[i]
// ^^^^^^
}
也代替声明
std::size_t i = str.length();
你可以写
auto i = str.length();