1

我似乎在不同平台上将 find() 与 STL 映射一起使用时遇到问题。这是我要完成的代码:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <map>

using namespace std;

void constructDictionary(map<string,bool> &dict);
bool isInDictionary(string word, map<string,bool> &dict);

int main(void)
{

    map<string, bool> dictionary;
    constructDictionary(dictionary);
    map<string, bool>::iterator it = dictionary.begin();

    while(it != dictionary.end()){
        cout << it->first <<endl;
        it++;
    }

    string word;
    while(true){
        cout << "Enter a word to look up: " << endl;
        cin >> word;
        if(isInDictionary(word, dictionary))
            cout << word << " exists in the dictionary." << endl;
        else
            cout << word << " cannot be found in the dictionary." << endl;
    }

    return 0;
}

void constructDictionary(map<string,bool> &dict)
{
    ifstream wordListFile;
    wordListFile.open("dictionaryList.txt");
    string line;

    while(!wordListFile.eof()){
        getline(wordListFile, line);
        dict.insert(pair<string,bool>(line, true));
    }

    wordListFile.close();
}

bool isInDictionary(string word, map<string,bool> &dict)
{
    if(dict.find(word) != dict.end())
        return true;
    else
        return false;
}

isInDictionary()如果在 Windows 中使用 Visual Studio 编译,则可以正常工作,但是,在 ubuntu 和 g++ 上,这仅适用于进入地图的最后一个条目。我查询的任何其他单词都返回 false。我不明白这种行为的差异。在这两种情况下,main 开头的 while 语句都会正确打印出地图中的所有内容,以证明所有内容都在那里。

有任何想法吗?谢谢你。

4

2 回答 2

3
  • 而 (!eof) 是错误的。采用while (getline(...))
  • 您需要处理 windows linefeed \r\n。可能您的字典是在 Windows 上生成的,并且最后一行没有换行符,因此除了最后一行之外的所有单词最后都有一个隐藏\r的。
于 2011-02-28T09:42:31.097 回答
2

输入文件中的 getline 和 line-endings 是否有错误?\r您可能会在 Linux 上发现它为每个单词添加了额外的内容。

假设你的单词都不包含空格,你可以通过简单地使用来解决这个问题:

std::string word;
while( wordListFile >> word )
{
   if( !word.empty() )
   {
       // do the insert
   }
}

您也可以使用 getline 但“修剪”任一端的字符串。不幸的是,没有标准的修剪功能。周围有一些实现。

您可能应该使用 std::set 作为您的集合类型,而不是这个额外的“布尔”,只要有条目,它总是正确的。

于 2011-02-28T09:41:11.003 回答