类方法中的For Loop运行时错误-数据结构

时间:2018-09-06 07:17:02

标签: c++ data-structures

因此,我应该创建一个代码,该代码具有一个存储字符串集合的容器类。该类应具有3个公共成员:一个构造函数,用于初始化一个空集合;一个插入函数,该集合向该集合添加一个字符串;以及一个函数,该函数接收数据/字符串值并返回其中的一个数据值(字符串/字)。集合-具体来说,其签名在数字上最接近参数签名的值。注意:该类应存储所有数据的签名(它应根据需要使用私有方法进行计算)。

此外,该代码还应包括一个分析函数,用于分析在给定签名附近找到数据的方法/函数的最坏情况下的运行时间。需要数据(字符串)操作的确切总数(作为n的封闭形式函数-容器中字符串的数量),可能包括读/写(在RAM中,而不是I / O),比较和算术运算。在这种情况下,数组/向量索引不是“数据”-仅关注字符串访问/操作。最后,应包括一个O标记函数来描述确切的计数。

到目前为止,我的代码包括3个公共成员和计算签名的私有方法。在此过程中,我设法解决了几个运行时错误,但是我仍然遇到了很多麻烦。具体来说,似乎是我遇到了运行时错误,其中我用compareData函数中的For循环触发了一个断点。我几乎可以肯定,这与初始化最近值变量和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 :(得分:0)

您实际上并不会存储容器中的任何CREATE OR REPLACE PROCEDURE SWD_AUTON_DML (p_dmlstat VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN -- Main transaction suspends here. EXECUTE IMMEDIATE p_dmlstat; -- Autonomous transaction begins here. COMMIT; -- Autonomous transaction ends here. END; -- Main transaction resumes here. --------------------- How to USE ------------------------------------- ---------------------------------------------------------------------- ---EXECUTE AUTON_DML(q'[UPDATE staging_pm_schedule_table SET NOTE = 'TEST_Variable']'); --OR ---EXECUTE AUTON_DML('UPDATE staging_pm_schedule_table SET NOTE = '''TEST_Variable''''); -在每个函数中,您都会创建一个新的 local 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),因为这会为您进行范围检查,并且如果您访问不存在的元素,则会引发异常。