我正在接收文本文件并将单词放入向量中。如果向量已经包含该单词,它将增加出现位置。如果它是一个新单词,我们将它推到向量上。当我调试这个时,一切看起来都是正确的,但是向量用每个单词填充,出现= 1,因为“i”似乎是一个索引。
如果我用i = 1进行初始化,则向量将超出范围。有什么帮助吗?
vector<wordFreq> words;
//already have 1 in vector, i initialized at 0.
while(!myfile.eof())
{
myfile >> tempWord; //takes word into variable
if (words[i].wordName == tempWord) //if it is found
{
//words[i].occurances++; //increment occurance member
}
else
{
//create new object
wordFreq tempElement;
tempElement.occurances = 1;
tempElement.wordName = tempWord;
words.push_back (tempElement); //push onto vector
}
i++;
}
答案 0 :(得分:0)
将while(!myfile.eof()) myfile >> tempWord
更改为
while ( myfile >> tempWord )
否则你会得到一个带有垃圾字的额外循环迭代。
无论如何,听起来你想要遍历每个单词的整个向量来找到它,例如:
int i;
for (i = 0; i < words.size(); ++i)
if ( words[i] == tempWord )
{
++words[i].occurances;
break;
}
if ( i == words.size() ) // not found
{
// create new object...
}
虽然这样可以正常工作,但有一些标准算法可以帮助您完成工作,特别是find
功能。查看find
的文档,看看是否可以用for
替换find
循环。
最后,如果您使用std::map
代替向量,则可以使用++my_map[tempWord].occurances;
替换整个代码块
答案 1 :(得分:0)
如果您只想计算“出现次数”这个词,也许地图可以帮助您:
map<string, int> m;
string tempWord;
while (myfile >> tempWord) ++m[tempWord];
// print out
for (map<string, int>::const_iterator p = m.begin(); p != m.end(); ++p) {
cout << p->first << '\t' << p->second << '\n';
}