使用向量获取运行时错误

时间:2013-12-01 16:18:48

标签: c++

所以,我从Accelerated C ++中读到了问题4.5,并将其解释为错误。我写了一个程序,它应该在字符串中显示一个单词的计数。但是,我可能做了一些非常愚蠢的事情,而且非常错误。我无法理解。

以下是代码:http://ideone.com/87zA7E

Stackoverflow表示指向ideone.com的链接必须附带代码。我不会粘贴所有这些,而是​​粘贴我认为最有可能出错的函数:

vector<str_info> words(const vector<string>& s) {

vector<str_info> rex;
str_info record;

typedef vector<string>::size_type str_sz;
str_sz i = 0;

while (i != s.size()) {
    record.str = s[i];
    record.count = 0;
    ++i; //edit

    for (str_sz j = 0; j != s.size(); ++j) {
        if (compare(record, s[j]))
            ++record.count;
    }

    for (vector<str_info>::size_type k = 0; k != s.size(); ++k) {
        if (!compare(record, rex[k].str))
            rex.push_back(record);
    }
}

return rex;
}

2 个答案:

答案 0 :(得分:0)

一个问题是你有这个:

str_sz i = 0;

while (i != s.size()) {

但你永远不会增加i,导致无限循环。在该循环内部,您将元素推送到向量rex。向量不能包含无限数量的元素。

答案 1 :(得分:0)

此外,您正尝试访问:

rex[k].str

for (vector<str_info>::size_type k = 0; k != s.size(); ++k) {
        if (!compare(record, rex[k].str)) // rex is empty in the beginning!!
            rex.push_back(record);
    }

但你不知道rex中是否有k + 1个元素。

编辑:将您的代码更改为:

while (i != s.size()) {

    // read new string into a record (initial count should be one).
    str_info record;
    record.str = s[i];
    record.count = 1;

    // check if this string already exists in rex
    bool found = false;
    for (vector<str_info>::size_type k = 0; k < rex.size(); ++k) {
        if ( record.str == rex[k].str ) {
            rex[k].count++;
            found = true;
            break;
        }
    }


    i++;        
    if ( found )
       continue;

    // if it is not found then push_back to rex
    rex.push_back( record );
}