Присвоение значений вектору указателей - PullRequest
0 голосов
/ 08 ноября 2018

Я перевожу некоторый алгоритм на C ++ (который я написал на R и уже перевел на C ++ с необработанными указателями). Проблема с оригинальным переводом C ++ состоит в том, что он терпит крах для больших матриц и страдает от утечек памяти (но примерно в 1000 раз быстрее, чем R, что удивительно) ... Поэтому я попробую еще раз с вектором. В основном у меня есть матрица с нулями и единицами, и я хочу заменить единицы на число, указывающее группу. Группа будет определяться по горизонтали или вертикали, связанных одной записи. Я делаю это путем построения матрицы указателей и изменения групповых индексов, на которые они указывают во время процесса.

Код ниже является выдержкой.

vector<int> groups(vector<int> matrix, int nrow, int ncol) {

    vector<connection> connections;
    vector<int *> pointersToIndices;

    int zeroGroupIndex = 0;
    int* O = &zeroGroupIndex;   
    int currentN = 1;
    int size = nrow * ncol;

    vector<int **> pointerMatrix;
    for (int i = 0; i < size; i++) {
        int** OO = &O;
        pointerMatrix.push_back(OO);
    }


    int col, row, index, leftIndex, upperleftIndex, upperIndex;
    for (col = 0; col < ncol; col++) {
        for (row = 0; row < nrow; row++) {
            index = nrow * col + row;       
            if (matrix[index] != 0) {
                upperIndex = nrow * col + row - 1;
                leftIndex = nrow * (col - 1) + row;
                if (row == 0 || matrix[upperIndex] == 0) {
                    currentN++;
                    matrix[index] = currentN;                   
                    pointersToIndices.push_back(&(matrix[index]));
                    // I assume the following does not do what i intend 
                    pointerMatrix[index] = &pointersToIndices.back();
                }
                else pointerMatrix[index] = pointerMatrix[upperIndex];
                if (col != 0 && matrix[leftIndex] != 0) *pointerMatrix[index] = *pointerMatrix[leftIndex];
            }
        }
    }
....
....

Теперь проблема в том, что назначения не работают так, как я хочу. Особенно линия

pointerMatrix[index] = &pointersToIndices.back();

кажется неудачным, так как в конце цикла все элементы pointerMatrix указывают на последнюю запись pointersToIndices, а не на правильную.

Я надеюсь, что смогу прояснить проблему. Какие-либо предложения? Большое спасибо.

1 Ответ

0 голосов
/ 08 ноября 2018

Проблема в том, что pointerToIndices будет в конечном итоге перераспределяться, когда он должен расти (после числа push_back с). Это делает недействительными указатели на его элементы (например, те, которые взяты и сохранены в строке после комментария), поэтому их использование в дальнейшем является неопределенным поведением.

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

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