Ошибка времени выполнения с циклом For в методе класса - Структуры данных - PullRequest
0 голосов
/ 06 сентября 2018

Итак, я должен создать код с классом контейнера, который хранит коллекцию строк.У класса должно быть 3 открытых члена: конструктор, который инициализирует пустую коллекцию, функция вставки, которая добавляет одну строку в коллекцию, и функция, которая получает значение данных / строки и возвращает одно из значений данных (строка / слово) вколлекция - в частности, значение, сигнатура которого численно ближе всего к сигнатуре параметра.Примечание: класс должен , а не хранить подписи всех данных (он должен вычисляться по мере необходимости, используя закрытый метод).

Кроме того, код должен включать функцию анализа, которая анализирует время выполнения метода / функции в наихудшем случае, которая находит данные рядом с заданной сигнатурой.Требуется точное общее количество (в виде функции n в закрытой форме числа строк в контейнере) операций с данными (строками), возможно, включая операции чтения / записи (в ОЗУ, а не ввода-вывода), сравнения и арифметические операции.В этом случае индексы массива / вектора не являются «данными» - интерес представляют только строковые обращения / операции.Наконец, для описания точного подсчета должна быть включена функция нотации.

Пока мой код включает в себя 3 открытых члена и закрытый метод для вычисления подписей.Мне удалось сгладить пару ошибок во время выполнения, но у меня все еще есть пара, с которыми у меня проблемы.В частности, похоже, что я получаю ошибку во время выполнения, когда я запускаю точку останова с помощью моего цикла For в функции CompareData.Я почти уверен, что это как-то связано с тем, как я проинициализировал переменную nearValue и переменную nextValue, но я не совсем уверен в конкретной проблеме.

Если кто-нибудь здесь может помочь мне выяснить, что я делаю неправильно и / или какие-либо другие логические ошибки или ошибки времени выполнения, которые есть в моем коде, я был бы очень признателен.Кроме того, если бы кто-то мог помочь мне с формулировкой функции анализа, чтобы выяснить запрошенное время выполнения (особенно в O-нотации), это было бы также здорово.

#include <iostream>
#include <string>
#include <vector>

using namespace std;


class stringCollection
{
    public:
        stringCollection(); 
        void addString(); 
        int compareData(string newString); 
    private:
        int calcSignature(string inp); 
        string userInput;
};

stringCollection::stringCollection()
{
    vector <string> useInp;
}

void stringCollection::addString()
{
    vector<string> useInp; //make vector a private variable and then reference it here instead?
    string insert;
    int i = 0;

    while (1) 
    {
        cout << "\nPlease enter a string.\nEnter as many as you want.\nWhen you're finished, type 'no more': \n\n" << endl;
        getline(cin, insert);

        if (insert == "no more")
            break;
    }

    useInp.push_back(insert);

}

int stringCollection::compareData(string newString)
{ 
    vector<string> useInp;
    int index = 0;
    int nearestValue = calcSignature(useInp[index]);
    int nextValue = calcSignature(useInp[index + 1]);
    int newSignature;

    newSignature = calcSignature(newString);

    for (string::size_type index = 0; index < useInp.size(); ++index)
    {
        if ((abs(nearestValue - newSignature)) > (abs(nextValue - newSignature)))
            nearestValue = nextValue;
    }

    return nearestValue;
}

int stringCollection::calcSignature(string inp)
{
    int total = 0;

    for (string::size_type index = 0; index < inp.length(); ++index)
    {
        total = total * 2 + static_cast<int>(inp[index]);
    } 

    return total;
}

int main()
{
    stringCollection classCall;
    string newString;
    int nearestValue;

    classCall.addString(); 

    cout << "\,\n\n\nPlease enter one final string: " << endl;
    getline(cin, newString);

    nearestValue = classCall.compareData(newString);

    cout << "\n\nGood news! Of all the strings you entered previously,\n the one with the closest ASCII value to the\n last string you entered is: " << nearestValue << endl;

    return 0;
}

1 Ответ

0 голосов
/ 06 сентября 2018

Вы на самом деле не храните любых string с в своем контейнере - в каждой функции вы создаете новый локальный vector, а затем выбрасываете его в конце функция, например:

stringCollection::stringCollection() // <-- constructs the object
{
    vector <string> useInp; // <-- local, not class member
} // <-- local vector is destroyed, not kept!

Затем вы пытаетесь заглянуть внутрь пустого vector, который вы только что создали, без содержимого:

int stringCollection::compareData(string newString)
{ 
    vector<string> useInp;
    int index = 0;
    int nearestValue = calcSignature(useInp[index]);
        // trying to read something out of index 0, but the container is completely empty!!!

Я полагаю, вы хотите, чтобы vector был членом вашего класса контейнера:

class stringCollection
{
    private:
    // data members:
    std::vector<std::string> storedStrings_;

    public:
        stringCollection(); 
        void addString(); 
        int compareData(string newString); 
    private:
        int calcSignature(string inp); 
        string userInput;
};

Затем в addString() удалите определение useInp и измените последнюю строку на storedStrings_.push_back(insert);.


Тогда всякий раз, когда вы читаете из storedStrings_, отметьте index < storedStrings_.size() (не <, не <=).

Вы, вероятно, также должны получить доступ к vector, используя storedStrings_.at(index) вместо storedStrings_[index], поскольку это делает проверку диапазона и выдает исключение, если вы получаете доступ к элементу, который не существует.

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