所以,我从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;
}
答案 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 );
}