2015-09-09 3 views
1

Я пытаюсь найти наибольшее количество символов в файле данных. поэтому, если в файле есть 24 файла, а 8-й идентификатор - распечатать 'e'. Я получаю сообщение об ошибке «*» в int max var. Это ошибка:C++ Найти наибольшее количество символов, используя карты

Ошибка 3 Ошибка C2440: «инициализации»: не удается преобразовать из «станд :: пары» к «» междунар

ifstream infile(filename); 
    if (!infile.is_open()) return;  
    char x; 
    map<char, int> count; 
    while (infile >> x) count[x]++; 
    for (auto it : count)  
     cout << it.first << " " << it.second << endl; 
    int max = *max_element(count.begin(), count.end(), count.value_comp()); 
    cout << max << endl; 
    return ' '; 

как всегда любая помощь приветствуется!

+0

Есть ли всего 256 символов, вы можете просто использовать массив для этого. –

ответ

2

У вас есть две проблемы

  • count.value_comp() сравнивает ключи карты :: value_type (ы), которые являются пары
  • max_element возвращает итератор к паре

Вы можете изменить код, указанный ниже:

#include <algorithm> 
#include <iostream> 
#include <fstream> 
#include <map> 

int main() { 
    std::ifstream infile("filename"); 
    if (!infile.is_open()) 
     return 1; // Check if file opened correctly 
    char x; 
    typedef std::map<char, int> map_type; 
    map_type count; 
    while (infile >> x) count[x]++; 
    for (auto it : count) // Pull this out of the while loop 
     std::cout << it.first << " " << it.second << std::endl; 
    auto less_count = [] (const map_type::value_type& a, const map_type::value_type& b) { 
     return a.second < b.second; 
    }; 
    auto max_pair = std::max_element(count.begin(), count.end(), less_count); 
    int max = max_pair->second; 
    std::cout << max << std::endl; 
} 
+0

Спасибо за помощь. Чаще всего он теперь возвращается как смайлик? – SaladSnake

2

std::max_element вернет ForwardIterator, который в вашем случае будет map<char,int>::iterator, указывая на pair<char,int>. Вы должны изменить последнюю строку

int max = max_element(count.begin(), count.end(),count.value_comp())->second; 
2

Когда вы разыменования std::map::iterator вы получаете std::pair и вы пытаетесь присвоить его int. Правильный синтаксис будет:

int max = max_element(count.begin(), count.end(), count.value_comp())->second; 

но вы должны проверить, есть ли элементы в этой карте, в противном случае вы можете разыменовать count.end() с UB. Это произойдет, если файл пуст, например.

Смежные вопросы