因此,我应该创建一个代码,该代码具有一个存储字符串集合的容器类。该类应具有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;
}
答案 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)
,因为这会为您进行范围检查,并且如果您访问不存在的元素,则会引发异常。