невозможно отобразить вектор - PullRequest
0 голосов
/ 11 марта 2020

Это мой txt файл, где первая строка - это номер dataSets. 2-я строка (переменная size1) равна количеству элементов в 3-й строке (массив A1), а 4-я строка (переменная size2) равна числу элементов в 5-й строке (массив A2). Моя функция readFile должна перезаписывать переменные и массивы, перечисленные выше, без перезаписи dataSets переменной.

Моя countElementsInArray функция предназначена для подсчета количества появлений цифр из массива A2 в массиве A1. У меня проблема с отображением вектора с именем count. В отладчике я вижу, что элементы, возвращаемые функцией fcount, передаются на счетчики векторов, но вывести этот вектор невозможно (программа останавливается на этом).

Идея программы состоит в том, чтобы сделать массив именованных векторов, количество вхождений цифр из массива A2 в массиве A1.

txt:

3
4
-5 -1 0 8
7
7 9 2 0 -7 2 -5
4
1 2 3 4
2
1 1
5
0 0 0 0 0
1
3

Result for above input should be:
Dataset1:
0 0 0 1 0 0 1
Dataset2:
1 1
Dataset3:
0
int main() {

    std::fstream file;
    openFile(file);
    std::vector<int> v1,v2;
    fread(file, v1, v2);

    file.close();
    return 0;
}
void fread(std::fstream &file, std::vector<int> &A1, std::vector<int> &A2) {

    std::vector<int> counts;
    int dataSets, size1, size2, x, y;
    file >> dataSets;
    for (size_t i = 0; i < dataSets; i++) {
        file >> size1;

        for (size_t j = 0; j < size1; j++) {
            file >> x;
            A1.push_back(x);
        }

        file >> size2;

        for (size_t j = 0; j < size2; j++) {
            file >> y;
            A2.push_back(y);
        }

        for (size_t j = 0; j < size2; j++) {
            int searchValue = A2[j];
            counts.push_back(fcount(A1, size1, searchValue));
        }

        int numberOfDataSet = i + 1;
        std::cout << "Dataset" << numberOfDataSet << ":" << std::endl;
        for(auto& k : counts)
            std::cout << k;
        std::cout << std::endl;
    }
}


int fcount(std::vector<int> &A, int size, int searchValue) {

    int count = 0, first = 0, last = size;
    int i = 1;
    int j = 1;
    while (first <= last) {
        int mid = first + (last - 1) / 2;

        if (A[mid] == searchValue) {
            count++;
            do {
                if (A[mid + i] == searchValue && A[mid - j] == searchValue) {
                    count += 2;
                    i++;
                    j++;
                } else if (A[mid + i] == searchValue) {
                    count++;
                    i++;
                } else if (A[mid - j] == searchValue) {
                    count++;
                    j++;
                }

                return count;
            } while (A[mid + i] == searchValue || A[mid - j] == searchValue);
        } else if (searchValue < A[mid])
            last = mid - 1;

        else if (searchValue > A[mid])
            first = mid + 1;
    }
    return count;
}

1 Ответ

0 голосов
/ 11 марта 2020

Проблема не в отображении вектора. Актуальная проблема в функции fcount. Он пытается индексировать вектор с отрицательным значением индекса. Так что программа на самом деле вылетает. Я внес некоторые изменения, чтобы исправить проблему

    int fcount(std::vector<int>& A, int size, int searchValue) {

int count = 0, first = 0, last = size - 1;
int i = 1;
int j = 1;
while (first <= last) {
    int mid = (first + last) / 2;  // Changed

    if (A[mid] == searchValue) {
        count++;
        do {
            if (A[mid + i] == searchValue && A[mid - j] == searchValue) {
                count += 2;
                i++;
                j++;
            }
            else if (A[mid + i] == searchValue) {
                count++;
                i++;
            }
            else if (mid > j && A[mid - j] == searchValue) { // Changed
                count++;
                j++;
            }

            return count;
        } while (A[mid + i] == searchValue || A[mid - j] == searchValue);
    }
    else if (searchValue < A[mid])
        last = mid - 1;

    else if (searchValue > A[mid])
        first = mid + 1;
}
return count;

}

    void fread(std::fstream& file, std::vector<int>& A1, std::vector<int>& A2) {

std::vector<int> counts;
int dataSets = 0;
int size1 = 0;
int size2 = 0;
int x = 0;
int y = 0;
file >> dataSets;
for (size_t i = 0; i < dataSets; i++) {
    file >> size1;

    for (size_t j = 0; j < size1; j++) {
        file >> x;
        A1.push_back(x);
    }

    file >> size2;

    for (size_t j = 0; j < size2; j++) {
        file >> y;
        A2.push_back(y);
    }

    for (size_t j = 0; j < size2; j++) {
        int searchValue = A2[j];
        counts.push_back(fcount(A1, size1, searchValue)); // In second iteration this line cause crash. So count vector is not displayed
    }

    int numberOfDataSet = i + 1;
    std::cout << "Dataset" << numberOfDataSet << ":" << std::endl;
    for (auto& k : counts)
        std::cout << k;
    std::cout << std::endl;
}

}

    int main() {

std::fstream file;
openFile(file);
std::vector<int> v1, v2;
fread(file, v1, v2);

file.close();
return 0;

}

...