Итак, я должен создать код с классом контейнера, который хранит коллекцию строк.У класса должно быть 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;
}