Изменения в векторе <bitset>изменение значений в другом векторе - PullRequest
0 голосов
/ 22 марта 2020

При условии следующего кода:

#include <iostream>
#include <bitset>
#include <set>
#include <string>
#include <vector>

using namespace std;

typedef pair<int, int> coordinate;
typedef vector<coordinate> path;

class Game {
private:
    vector<bitset<15>> board{15};
    vector<path> paths;
public:
    Game() {
        for (int i = 0; i < 15; i++) {
            string line;
            getline(cin, line);
            for (int j = 0; j < 15; j++) {
                if (line[j] == '.') {
                    board[i].set(j); // the problem no longer occurs after removing this line
                    if (paths.size() > 2)
                        cout << "A: " << paths[2].back().first << endl;
                    paths.emplace_back(1, make_pair(j, i));
                    if (paths.size() > 2)
                        cout << "B: " << paths[2].back().first << endl;
                }
            }
        }
    }
};

int main() {
    Game game;
    return 0;
}

Я столкнулся с проблемой, значения в моем векторе paths изменяются строкой board [i] .set (j ); . Мне кажется, что эти два вектора совершенно не связаны. Учитывая следующий вход (эта проблема возникает для нескольких входов, это только один, который я тестировал):

.........xx....
..xx.....xx....
..xx...........
...............
...............
.........xx....
....xx...xx....
....xx.........
...............
...xx..xx......
...xx..xx......
...............
...............
............xx.
............xx.

Этот вход дает следующий вывод:

A: 2
B: 2    
A: 2
B: 2
...
A: 2
B: 2
A: 3
B: 3
A: 3
B: 3
A: 7
B: 7
A: 15
B: 15
A: 31
B: 31
A: 63
B: 63
A: 127
B: 127
A: 255
B: 255
A: 511
B: 511
A: 1023
B: 1023
A: 2047
B: 2047
A: 4095
B: 4095
A: 8191
B: 8191
A: 16383
B: 16383
A: 32767
B: 32767
...
A: 32767
B: 32767
A: 32767
B: 32767

Одна вещь, которую я попробовал, это изменение board [i] .set (j); на board [i] | = 1 << j; </em>, но это не имело никакого эффекта.

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

1 Ответ

2 голосов
/ 22 марта 2020

Проблема заключается в инициализации:

vector<bitset<15>> board{15};

Это не вектор с 15 элементами, а вектор с одним элементом, который инициализируется со значением 15. Таким образом, board[i] выходит за пределы для любого i > = 1. Это вызывает неопределенное поведение, поэтому может произойти все что угодно.

Если размер вектора в любом случае фиксирован, std::array может быть лучшим выбором:

std::array<std::bitset<15>, 15> board;

Или инициализировать его в списке инициализатора конструктора:

Game() : board(15) // intialize with 15 default-constructed elements
{ /* other logic */}
...