C ++ STL Map - найти (пара) работает в Windows Visual Studio, но не с g ++ в Linux! - PullRequest
1 голос
/ 28 февраля 2011

Кажется, у меня проблемы с использованием 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() работает нормально, если скомпилировано с использованием Visual Studio в Windows, однако, на Ubuntu и G ++, это работает только для последней записи в карту.Любое другое слово, которое я запрашиваю, возвращает false.Я не понимаю несоответствия в этом поведении.В обоих случаях оператор while в начале main правильно распечатывает все на карте, чтобы доказать, что все есть.

Есть идеи?Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011
  • пока (! Eof) не так. Используйте while (getline(...))
  • Вам нужно обработать перевод строки Windows \r\n. Вероятно, ваш словарь генерируется в Windows, а последняя строка не имеет перевода строки, поэтому все слова, кроме последнего, имеют скрытый \r в конце.
2 голосов
/ 28 февраля 2011

Ошибка в getline и в конце строки во входном файле? Вы можете обнаружить, что в Linux добавляется дополнительная \r к каждому слову.

Предполагая, что ни одно из ваших слов не содержит пробелов, вы можете обойти это, просто используя:

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

Вы также можете использовать getline, но "обрезать" строки на любом конце. К сожалению, нет стандартной функции обрезки. Есть несколько реализаций вокруг.

Вы, вероятно, должны использовать std :: set в качестве типа коллекции вместо этого дополнительного "bool", которое всегда имеет значение true, когда есть запись.

...