我的代码有问题:它总是崩溃,但是当我评论时:dataResults [i] .clear();
有关于这个原因的想法吗?
std::vector<std::string> r_OCRtoRetrieve;
std::vector<std::string> DBentries;
//stuff..
int distance = 9999; //TODO change here
int minDistance = 9999;
for(int i=0; i< r_OCRtoRetrieve.size(); i++)
for(int j=0; j< DBentries.size(); j++)
{
distance = calcDistance( (const char *)r_OCRtoRetrieve[i].c_str(),(const char *) DBentries[j].c_str());
if (distance == minDistance)
dataResults[i].push_back(DBentries[j]);
else
if(distance < minDistance)
{
minDistance = distance;
dataResults[i].clear();
dataResults[i].push_back(DBentries[j]);
}
}
编辑:
发现错误..我必须初始化它..这里是代码:
for(int i=0; i< r_OCRtoRetrieve.size(); i++)
{
dataResults.push_back(std::vector<std::string>());
for(int j=0; j< DBentries.size(); j++)
{
distance = calcDistance( (const char *)r_OCRtoRetrieve[i].c_str(),(const char *) DBentries[j].c_str());
if (distance == minDistance)
dataResults[i].push_back(DBentries[j]);
else
if(distance < minDistance)
{
minDistance = distance;
if(dataResults[i].size() > 0)
dataResults[i].clear();
dataResults[i].push_back(DBentries[j]);
}
}
}
答案 0 :(得分:1)
如果您的索引超出范围异常,可能是因为您的索引i
超出了向量范围dataResults
如果i
大于dataResults.size()
,那么基本上不够明显,那么dataResults[i].clear();
会抛出异常。
编辑:
考虑用STL迭代器替换基于索引的循环,并用C ++样式转换替换c风格的转换。您的if语句也可以重新访问......
编辑2:
猜测可能存在的问题,因为你没有告诉我们异常是什么,但你有vector<vector<string>>
对吗?如果是这样,你需要在调用方法或构造循环之前检查你索引到有效位置的内容,以便它不会超出索引范围。
像这样:
if (dataResults.size() > i)
{
// now we know dataResults[i] will be valid
dataResults[i].clear();
// etc
}
老实说,我可能会做更多的事情:
typedef std::vector<std::string> StrArray;
for(StrArray::const_iterator ret(r_OCRtoRetrieve.begin()); ret != r_OCRtoRetrieve.end(); ++ret)
{
// ret will be an const iterator to each string element in r_OCRtoRetrieve
for(StrArray::const_iterator entry(DBentries.begin()); entry != DBentries.end(); ++entry)
{
// entry will be an const iterator to each string element in DBentries
distance = calcDistance(ret->c_str(), entry->c_str());
// init new StrArray in dataResults as needed
// set new min distances as needed
// push back strings to dataResults
// whatever else you want to do
// yata yata
}
}
答案 1 :(得分:1)
可能,您的向量dataResults
的大小小于i
的某个值
答案 2 :(得分:0)
启动时DataResults中有什么?什么?如果没有,那么第一次通过,当距离小于9999时,代码将尝试在第一个零第一个索引处清除不存在的位置并抱怨。
如果你进行调试构建,你应该收到一条有意义的消息。