如何用 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;  
}

代码解释,自下而上:

你可以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() 无论如何都需要。