如何用 STL 算法或迭代器替换这个原始循环? (避免未经检查的下标运算符)
How do I replace this raw loop with an STL algorithm or iterators? (avoiding unchecked subscript operator)
我正在用 C++ 实现 the Snake game 的通用克隆,作为遵循 C++ 推荐指南的练习。我目前正在研究 Snake 的 update() 方法,它触发了一个 Guideline-violation 用于在 for 循环中使用未经检查的下标运算符:
Prefer to use gsl::at() instead of unchecked subscript operator
(bounds.4).
我想避免 gsl::at() / container::at() 的冗余范围更改检查,并且不想抑制警告。考虑到这一点,我怎样才能用更多的东西替换这个原始循环Guideline-friendly?(例如,STL 算法、迭代器,你有什么)
void Snake::update() noexcept {
if (hasTrailingSegments()) {
for (auto i = body_segments.size() - 1; i > 0; i--) {
body_segments[i] = body_segments[i - 1];
}
}
head() += heading;
}
代码解释,自下而上:
- 循环需要确保每个 body 片段都跟随(= 占据)它前面的片段。
- body_segments 是一个 std::vector 整数对。
- hasTrailingSegments() 确保“trailing_pieces”的 size() > 1(例如,玩家不仅有头部)。
- head() 就是 body_segments[0]
你可以std::rotate
蛇,让旧的尾巴成为前面的元素,然后用新的部分覆盖它。
void Snake::update() noexcept {
auto new_head = head() + heading;
std::rotate(body_segments.begin(), body_segments.end() - 1, body_segments.end());
head() = std::move(new_head);
}
或者,您可以 copy_backward
正文,覆盖尾部。
void Snake::update() noexcept {
std::copy_backward(body_segments.begin(), body_segments.end() - 1, body_segments.end());
head() += heading;
}
只要 Snake
始终至少有一个段,这些都是安全的,head()
无论如何都需要。
我正在用 C++ 实现 the Snake game 的通用克隆,作为遵循 C++ 推荐指南的练习。我目前正在研究 Snake 的 update() 方法,它触发了一个 Guideline-violation 用于在 for 循环中使用未经检查的下标运算符:
Prefer to use gsl::at() instead of unchecked subscript operator (bounds.4).
我想避免 gsl::at() / container::at() 的冗余范围更改检查,并且不想抑制警告。考虑到这一点,我怎样才能用更多的东西替换这个原始循环Guideline-friendly?(例如,STL 算法、迭代器,你有什么)
void Snake::update() noexcept {
if (hasTrailingSegments()) {
for (auto i = body_segments.size() - 1; i > 0; i--) {
body_segments[i] = body_segments[i - 1];
}
}
head() += heading;
}
代码解释,自下而上:
- 循环需要确保每个 body 片段都跟随(= 占据)它前面的片段。
- body_segments 是一个 std::vector 整数对。
- hasTrailingSegments() 确保“trailing_pieces”的 size() > 1(例如,玩家不仅有头部)。
- head() 就是 body_segments[0]
你可以std::rotate
蛇,让旧的尾巴成为前面的元素,然后用新的部分覆盖它。
void Snake::update() noexcept {
auto new_head = head() + heading;
std::rotate(body_segments.begin(), body_segments.end() - 1, body_segments.end());
head() = std::move(new_head);
}
或者,您可以 copy_backward
正文,覆盖尾部。
void Snake::update() noexcept {
std::copy_backward(body_segments.begin(), body_segments.end() - 1, body_segments.end());
head() += heading;
}
只要 Snake
始终至少有一个段,这些都是安全的,head()
无论如何都需要。