Список несовместимых итераторов и арифметическое переполнение - PullRequest
0 голосов
/ 20 ноября 2019

У меня есть такая часть кода:

for (auto i = 0; i < WINDOW_SIZE; ++i) {
    if (current == goal) break;
    if (came_from.find(current) == came_from.end())
      break;
    next_best = came_from[current]; 
    if (space_map[i].find(next_best) != space_map[i + 1].end()) {
      auto search1 = space_map[i].find(current);
... ... ... ... ... ...

Где

1) space_map: std::vector<std::unordered_map<Node, Agent*>> (where Node and Agent are my onw classes.)
2) came_from: std::unordered_map<Node, Node>
3) current, goal: Node
4) WINDOW_SIZE: define, which equal 8

Есть список специализации hash_map для unordered_map и Node:

namespace std {
template <>
struct hash<Node> {
  std::size_t operator()(const Node &n) const {
    std::size_t const h1 = std::hash<std::size_t>{}(n.x);
    std::size_t const h2 = std::hash<std::size_t>{}(n.y);
    return (h1 ^ (h2 << 1));
  }
};

}  // namespace std
typedef struct Node {
  uint x, y, f_score, g_score;

  bool operator==(const Node &n) const { return (x == n.x && y == n.y); }

  bool operator!=(const Node &n) const { return (x != n.x || y != n.y); }

  friend std::ostream &operator<<(std::ostream &out, const Node &n) {
    out << '[' << n.x << ", " << n.y << ']';
    return (out);
  }
} Node;

Когда я запускаю отладку, я получаю такую ​​ошибку: error's image

Я рассмотрел случай с WINDOW_SIZE - 1, возможно, это была ошибка переполнения. Но не та же ошибка. Я выяснил, что здесь происходит ошибка:

if (space_map[i].find(next_best) != space_map[i + 1].end())

Также у меня есть такое уведомление, что у меня есть "C26451: Арифметическое переполнение" с "+" здесь space_map[i + 1].end() [i + 1]. Вероятно, это будет полезно. Может ли кто-нибудь объяснить мне, где я не прав?

1 Ответ

0 голосов
/ 21 ноября 2019

Вы не дали Минимальный, полный поддающийся проверке пример

Но space_map[i].find(next_best) != space_map[i + 1].end()

Невозможно. std::unordered_map::find() возвращает итератор. И:

Возвращаемое значение

Итератор элемента с ключом, эквивалентным ключу. Если такой элемент не найден, возвращается итератор конца конца (см. end()).

Но итератор space_map[i] отличается отэто из space_map[i+1]. Вы не можете сравнивать два разных итератора

Так что это должно быть

space_map[i].find(next_best) != space_map[i].end()

или

space_map[i+1].find(next_best) != space_map[i+1].end()

Вы не показываете достаточно кода, поэтому я должен сделать предположенияВот. Я бы использовал местную ссылку, чтобы предотвратить эту ошибку.

for (auto spMpCurrent = std::cbegin(space_map);
     spMpCurrent != std::next(std::cbegin(space_map), WINDOW_SIZE);
     spMpCurrent++) {
    if (current == goal) break;
    if (came_from.find(current) == came_from.end()) break;
    next_best = came_from[current]; // inline this?
    auto spMpNext = std::next(spMpCurrent);
    if (spMpNext->find(next_best) != spMpNext->end()) {
      auto search1 = spMpCurrent->find(current);

Ваш дизайн выглядит очень (излишне?) Сложным. Может быть, это можно упростить ... но поскольку вы не показываете достаточно кода, мы не можем вам помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...