只有在清除后才能在矢量矢量上崩溃

时间:2011-05-05 15:54:42

标签: c++ string vector crash

我的代码有问题:它总是崩溃,但是当我评论时: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]);
    }
    }

  } 

3 个答案:

答案 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时,代码将尝试在第一个零第一个索引处清除不存在的位置并抱怨。

如果你进行调试构建,你应该收到一条有意义的消息。