Получить значение от iterator.first - PullRequest
2 голосов
/ 11 апреля 2019

Я начал небольшой игрушечный проект, чтобы научить себя C ++ и врезался в стену. В коде ниже выделенная строка вызывает ошибку сборки, говоря:

welcome.cc: 65: 26: ошибка: невозможно преобразовать 'std :: _ Rb_tree_iterator>' в 'char' в назначение current = result.first;

и я не уверен почему. Цель состоит в том, чтобы создать цепочку Маркова для английских географических названий, цель рассматриваемой строки - обновить текущую букву в сгенерированном географическом названии случайным образом выбранным значением предыдущего, мой метод случайного выбора взят из этот вопрос . Как я уже сказал, новичок в C ++ и не знаю, что я сделал не так.

    int main(int argc, char**argv) {
    string line;
    ifstream myfile;
    std::multimap<char, char> m;
    myfile.open ("C:\\Users\\james\\Desktop\\placenames.txt");
    if (myfile.is_open()){
        while ( getline (myfile,line) )
        {
            for(std::string::size_type i = 0; i < line.size(); ++i) {
                std::cout<<line[i]<<std::endl;
                m.insert(std::pair<char, char>(line[i], line[i+1]));
            }
        }
    for (std::multimap<char, char>::iterator it = m.begin();it != m.end(); ++it)
        cout << "  [" << (*it).first << ", " << (*it).second << "]" << endl;
    myfile.close();
//    for( auto it = m.begin(), end = m.end();it != end; it = m.upper_bound(it->first))
//        cout << (*it).first << ' ' << m.count( (*it).first) << endl;
    auto current = 'A';
    std::string name = "A";
    typedef std::multimap<const char, char>::iterator MMAPIterator;
    for (int j=0; j<8; ++j){
        std::pair<MMAPIterator, MMAPIterator> result = m.equal_range(current);
        std::size_t sz = std::distance(result.first, result.second);
        std::size_t idx = std::rand() % sz;
        std::advance(result.first, idx);

        current = result.first; <------THIS LINE

       //name+=current;
    }
    cout << name;
  }
  else cout << "Unable to open file"; 

  return 0;  
}

Я знаю, что это довольно наивная реализация цепочки марков, кстати. Как я уже сказал, целью было поиграть с С ++, а не с чем-либо еще.

1 Ответ

4 голосов
/ 11 апреля 2019

Здесь у вас есть двойной слой пар, во-первых, функция equal_range возвращает диапазон, поэтому ваш

std::size_t sz = std::distance(result.first, result.second);

Сообщает вам, сколько предметов в диапазоне, чтобы получить элемент этого диапазона (вашу пару символов), вам нужно

auto random_element = result.first;
auto the_const_char = random_element.first;
auto the_non_const_char = random_element.second;
...