1

我有一个任务,我坚持。我需要创建一个程序来读取输入文件,将每个单词以及读取该单词的次数(因此是结构)存储到一个向量中。然后这些值需要按字母顺序打印出来。

我想出了一些我认为正确的方法:

struct WordInfo {
string text;
int count; 
} uwords, temp;

string word;
int count = 0; //ignore this. For a different part of the task
vector<WordInfo> uwords;

while (cin >> word) {
    bool flag = false;
    count += 1;
    for (int i = 0; i < uwords.size(); i++) {
        if (uwords[i].text == word) {
            flag = true;
            uwords[i].count += 1;
        }
    }
    if (flag == false) {
        if (count == 1) { //stores first word into vector
            uwords.push_back(WordInfo());
            uwords[0].count = 1;
            uwords[0].text = word;
        } else {
            for (int i = 0; i < uwords.size(); i++) {
                if (word < uwords[i].text) {
                    uwords.push_back(WordInfo());
                    WordInfo temp = {word, 1};
                    uwords.insert(uwords.begin() + i, temp);
                }
            }
        }
    }
}

现在我遇到的问题是,当我运行程序时,它似乎陷入了无限循环,我不明白为什么。尽管我已经进行了足够的测试以意识到它可能在最后一个 if 语句中,但我尝试修复它并不好。任何帮助表示赞赏。干杯。

编辑:我忘了提,我们必须使用向量类,我们可以使用的东西有限,排序不是一个选项:(

4

2 回答 2

2
            if (word < uwords[i].text) {
                uwords.push_back(WordInfo());
                WordInfo temp = {word, 1};
                uwords.insert(uwords.begin() + i, temp);
            }

好好看看这段代码:

首先,它实际上会在您的列表中插入 2 个单词;一次是“空”,一次是push_back,一次是insert。只要当前单词小于该位置的单词,它就会这样做i

一旦插入,就会有 2 个新元素可以通过;一个实际上在 的当前位置i,所以在下一次迭代中,我们将再次比较同一个词 - 所以你的循环卡住了,因为i每次迭代索引都会增加 1,但i只会增加刚刚插入的元素的步数!

为了快速解决,您希望 (1) 搜索之前单词比当前单词“小”但下一个单词更大的位置。就像是

if (uwords[i-1].text < word && word < uwords[i].text) {

(2)你想摆脱push_back电话。

此外,(3)您可以在 if 条件为真后中断循环 - 您已经插入了 then,无需进一步迭代。并且(4),通过一些条件调整,count == 1实际上可以合并到循环中。修改的代码部分(将替换您的整个if (code == false)块 - 警告,尚未测试):

if (!flag) {
    for (int i = 0; i <= uwords.size(); ++i) {
        if ((i == 0 || uwords[i-1].text < word) &&
            (i == uwords.size() || word < uwords[i].text)) {
            WordInfo temp = {word, 1};
            uwords.insert(uwords.begin() + i, temp);
            break;
        }
    }
}
于 2013-11-07T12:34:38.983 回答
2

你不应该推你的话 nin 向量,但在地图

std::map<std::string,int>

由于 map 在 map 上具有可比较的键迭代器,因此自动返回排序后的范围,如果需要,以后可以将其推入向量中。

于 2013-11-07T12:34:47.870 回答