2013-06-19 2 views
0

Я читаю из файла и беру слова в качестве токенов с strtok. Я пытаюсь сохранить слова в структуре карты. Я не знаю, как вставить маркеры на карту.Текст Гистограмма, маркеры, сохраненные на карте

Мой код до сих пор:

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

using namespace std; 

//std::map <string, int> grade_list; 

int main() 
{ 
    std::map <string, int> grade_list; 

    char text[100]; 
    int nr=0, i=1; 
    char *ptr; 

    ifstream myfile("ana.txt"); 

    if(!myfile.is_open()) 
     cout << "Could not open file" << endl; 
    else 
    { 
     myfile.get(text, 100); 

     ptr = strtok(text, " ,.-?!"); 

     while(ptr != NULL) 
     { 
      nr++; 

      cout << ptr << endl; 
      ptr = strtok(NULL, " ,.-?!"); 

      grade_list.insert(ptr); 

      i++; 
     } 
    } 

    cout << "\nAveti " << nr << " cuvinte." << endl; 

    return 0; 
} 
+0

можно вставить с помощью команды вставки. Взгляните на примеры здесь http://www.cplusplus.com/reference/map/map/insert/ – Pradheep

+0

http://www.cplusplus.com/reference/map/map/operator%5B%5D/ – banuj

ответ

2

std::map ассоциативный контейнер, обеспечивает Key -> Value отношения. В вашем случае это std::string -> int. Таким образом, вы должны указать Value при вставке также:

grade_list[ptr] = nr; 

Кроме того, вместо char массива и использование strtok я предлагаю использовать std::string и boost::algorithm::split или boost::tokenizer.


Я хочу видеть, для каждого слова в файле, как Manny раз он появляется в тексте.

Таким образом, вы должны изменить тип Value в map к std::size_t (так как вы din't нужно отрицательные значения):

std::map <string, std::size_t> grade_list; 

И просто написать:

++grade_list[ptr]; 
+0

Я хочу чтобы увидеть каждое слово в файле, как мужественные моменты появляются в тексте. – Manheim

0

Вы должны вероятно, посмотрите на определение std::map::insert, параметр value_type - это std::pair< std::string, int >, поэтому вам, вероятно, следует написать инструкцию insert как:

grade_list.insert(std::pair< std::string, int >(std::string(ptr), 1)); 

Это добавит запись в карту с ключом «знак», а значение 1.

То, что вы, вероятно, хотите больше походит добавить запись, если она не существует инкремента или значение:

это может быть достигнуто, написав что-то вроде

if (grade_list.find(ptr) == grade_list.end()) 
{ 
    // insert new entry 
    grade_list.insert(std::pair< std::string, int >(std::string(ptr), 1)); // can be written as grade_list[ptr] = 1; 
} 
else 
{ 
    // increment token 
    grade_list[ptr] += 1; // can be written as grade_list[ptr]++; 
} 
+0

Использование 'insert' здесь бесполезно. 'operator []' вставляет новый элемент в контейнер, используя ключ в качестве ключа и стандартное построенное сопоставленное значение и возвращает ссылку на вновь построенное сопоставленное значение. Таким образом, поскольку встроенные типы по умолчанию инициализируются с помощью '0', нет необходимости писать' grade_list [ptr] = 1; 'even - мы могли бы использовать' ++ grade_list [ptr]; 'в обоих случаях. – soon

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