Почему я могу получить доступ к элементам карты C ++ с помощью цикла for, но не по отдельности? - PullRequest
0 голосов
/ 28 ноября 2018

У меня небольшая проблема с кодом ниже.

#include <iostream>
#include <fstream>
#include <string>
#include <map>

std::map<std::string, int> m; //Dictionary map

int main() {

    std::ifstream dictionaryFile("dictionary.txt");

    std::string str;
    int probability = -1;

    //Read dictionary.txt and assign to map
    while(std::getline(dictionaryFile, str)) {

        if(str.find("#!comment:") == std::string::npos) {   //Not a comment
            m.insert(std::pair<std::string, int>(str, probability));
        }
        else {
            probability++;
        }

    }

    dictionaryFile.close();


    //Iterate and print through map -- THIS WORKS
    std::map<std::string, int>::iterator pos;
    for(pos = m.begin(); pos != m.end(); ++pos) {
        std::cout << "Key: " << pos->first << std::endl;
        std::cout << "Value: " << pos->second << "\n" << std::endl;
    }

    //Is "very" in the map? -- THIS DOES NOT WORK
    std::cout << m.find("very")->second << std::endl;

    if(m.find("very") != m.end()) {
        std::cout << "found it" << std::endl;
    } else {
        std::cout << "did not find it" << std::endl;
    }

}

Я читаю в файле "dictionary.txt" и вставляю каждое слово в карту.1 или 2 - это значение, связанное с этим ключом, в зависимости от вероятности слова.

Я могу перебирать карту и печатать ее элементы из цикла for, как показано.Но я не могу получить доступ к каждому элементу индивидуально с помощью m.find (), m.count () или оператора [].Каждый из них выглядит так, как будто карта пуста.

У меня неправильный синтаксис?Обнаружил ли я ошибку в std :: map?Буду признателен за любую помощь!

Вот dictionary.txt , если хотите.

1 Ответ

0 голосов
/ 28 ноября 2018

Ваш файл содержит окончания строк Windows CRLF \r\n.Они автоматически переводятся в \n с обработкой по умолчанию istream в Windows.Тем не менее, вы работаете в системе Linux, которая будет воспринимать вашего персонажа \r как нечто особенное.

Существуют различные способы обойти это.Простейшим было бы не использовать такие файлы в качестве входных данных в Linux.Вы можете найти ответы в других разделах этого сайта, чтобы узнать, как конвертировать окончания строк в оболочке.

Если вы абсолютно хотите, чтобы ваша программа обрабатывала их, вам нужно ввести дополнительный код.Это может быть так же просто, как проверка последнего символа:

if (!str.empty() && str.back() == '\r')
    str.pop_back();

Для стандартной библиотеки до C ++ 11, в которой нет std::string::pop_back, вы можете просто вызвать str.erase(str.size()-1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...