不比较正确的向量元素

时间:2014-03-17 02:19:56

标签: c++ input vector

我正在接收文本文件并将单词放入向量中。如果向量已经包含该单词,它将增加出现位置。如果它是一个新单词,我们将它推到向量上。当我调试这个时,一切看起来都是正确的,但是向量用每个单词填充,出现= 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++;
}

2 个答案:

答案 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';
}