2016-09-05 3 views
0

У меня есть структура:Как подсчитать количество уникальных элементов в массиве структур?

struct wordItem 
{ 
    string word; 
    int count; 
}; 

Я читаю в текстовый файл со многими другими словами и хранящие их в массив.

ifstream inputFile("data.txt"); 
    if(inputFile.is_open()) 
    { 
     while(getline(inputFile, data, ' ')) 
     { 
     wordItemList[i].word = data; 
     i++; 
     } 
    } 

Мой вопрос - это лучший способ подсчитывать каждый раз, когда в массиве появляется слово. Например, если мой data.txt файл был

the fox jumped over the fence 

Я хочу, чтобы иметь возможность хранить, сколько раз каждое слово в пределах структуры «счетчика INT;»

+0

Вам нужна структура данных для сопоставления слова счетчику. В C++ у нас есть std :: map. Если это домашняя работа, вы должны сообщить нам, каков ваш уровень прогресса, возможно, std :: map еще не является для вас вариантом. – vz0

+0

['std :: map '] (http://en.cppreference.com/w/cpp/container/map) или ['std :: unordered_map '] (http://en.cppreference.com/w/cpp/container/unordered_map). – Cornstalks

+0

Concur с Cornstalks. [Что-то вроде этого] (http://pastebin.com/JnGnwyfp). Извините заранее за любые ошибки синтаксиса. Измените каждый 'unordered_map' на' map', если хотите заказать). Да, это действительно так просто. Короче говоря, вам не нужна эта структура; карта будет содержать счетчик для вашего значения в виде сопоставленного значения. – WhozCraig

ответ

1
ifstream inputFile("data.txt"); 
if(!inputFile.is_open()) { 
    cerr << "Can't open data.txt\n"; 
    exit(0); 
} 

map<string, int> freq; 
while(getline(inputFile, word, ' ')) 
    ++freq[word]; 
1

Используйте std::multiset или std::unordered_multiset. Производительность немного зависит от вашего набора данных, поэтому необходима определенная настройка, чтобы найти лучший на практике. Что-то, как это будет работать (адаптироваться файловом кодом для чтения):

#include <iostream> 
#include <unordered_set> 

int main() { 

    std::unordered_multiset<string> dict; 

    for (auto&& s : {"word1", "word2", "word1"}) { 
     dict.insert(s); 
    } 

    std::cout << dict.count("word1") << std::endl; // prints 2 
    return 0; 
} 

В зависимости от набора данных & размера, вы можете также использовать более оптимизированную структуру данных для хранения & сравнения строк, например, trie, но это не доступно в стандарте, или boost, и большую часть времени это немного перехитрить IMHO (хотя вы можете найти some implementations).

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