2013-03-30 4 views
3

Я пишу программу на C++, которая читается в английском словаре (по порядку), а также делает дальнейшую обработку.Как хранить английский словарь?

На первом этапе я решил прочитать весь контент в 2D-массиве.

string dictionary[x][y]; 

, где x только размер 26, представляющий A-Z, и y, чтобы спасти слово, что относительная переменная x.

Но я не могу предсказать размер y, и он является переменным, поэтому я не знаю, как это можно было бы сделать.

Во-вторых, я слышал, что контейнер под названием vector. Как я могу использовать vector для выполнения вышеуказанного дизайна? Например, используя 2D-вектор и используя первое измерение для переноса первой буквы, а вторая - для переноса слова?

ответ

2

Если ваша поддержка компилятора некоторых C++ 11 особенности

#include <algorithm> 
#include <iterator> 
#include <string> 
#include <vector> 

int main() 
{  
    std::vector<std::vector<std::string> > dictionary(26); 
    //'a' part 
    dictionary[0].push_back("alien"); 
    dictionary[0].push_back("amend"); 
    dictionary[0].push_back("apple"); 

    //....... 
    //'z' part 
    dictionary[25].push_back("zero"); 
    dictionary[25].push_back("zoo"); 

    //sort all of the words after insert 
    for(auto &strs : dictionary){ 
     std::sort(std::begin(strs), std::end(strs)); 
    } 

    //find the specific words of 'a' 
    auto const it = std::equal_range(std::begin(dictionary[0]), std::end(dictionary[0]), "apple"); 
    if(it.first != it.second){ 
     std::cout<<*(it.first)<<std::endl; 
    }else{ 
     std::cout<<"The word do not exist"<<std::endl; 
    }   

    return 0; 
} 

, если нет, то коды станут немного утомительно

#include <algorithm> 
#include <string> 
#include <vector> 

int main() 
{  
    std::vector<std::vector<std::string> > dictionary(26); 
    //'a' part 
    dictionary[0].push_back("alien"); 
    dictionary[0].push_back("amend"); 
    dictionary[0].push_back("apple"); 

    //....... 
    //'z' part 
    dictionary[25].push_back("zero"); 
    dictionary[25].push_back("zoo");    

    //you could use std::for_each if you like, I choose for loop because I 
    //don't like to write so many trivial functor 
    typedef std::vector<std::vector<std::string> >::size_type size_type; 
    size_type const size = dictionary.size(); 
    for(size_type i = 0; i != size; ++i){ 
     std::sort(dictionary[i].begin(), dictionary[i].end()); 
    } 

    //find the specific words of 'a' 
    typedef std::vector<std::string>::const_iterator StrIter; 
    std::pair<StrIter, StrIter> it = std::equal_range(dictionary[0].begin(), dictionary[0].end(), "apple"); 
    if(it.first != it.second){ 
     std::cout<<*(it.first)<<std::endl; 
    }else{ 
     std::cout<<"The word do not exist"<<std::endl; 
    }  

    return 0; 
} 
2

Вы можете использовать multimap с char и string.

Пример:

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

using namespace std; 

multimap<char,string> dictionary; 

void printLetter(char ch) 
{ 
    for (auto it=dictionary.equal_range(ch).first; it!=dictionary.equal_range(ch).second; ++it) 
    { 
     cout << it->second << endl; 
    } 
} 

int main() 
{ 
    fstream file; 
    file.open("file.txt"); 
    //Read the data from the file 
    while(!file.eof()) 
    { 
     string temp; 
     file >> temp; 
     dictionary.insert(pair<char,string>(temp[0],temp)); 
    } 

    file.close(); 
    //Print all 
    for(auto i: dictionary) 
    { 
     cout << i.first << ":" << i.second << endl; 
    } 
    //Print words starting with specific letter 
    printLetter('A'); 

    return 0; 
} 
0

Вы можете использовать массив векторов: std::vector<string> dictionary[26]. Идея это будет такой же, как ваш первый (кроме добавления слов к рядам с std::vector::push_back() методом;))

2

Чтобы получить ответ на свой вопрос, вы могли бы сделать:

std::vector<string> dictionary[26]; 

dictionary[4] теперь vector (как массив с переменной длиной) strings

Но есть лучшие способы хранения отсортированного словаря. Если вы никогда не добавляете слова, вы можете просто положить все это в std::vector<std::string> и отсортировать его один раз, используя std::sort(dictionary.begin(), dictionary.end()). Или, если вам нужно добавлять/удалять слова и сохранять отсортированный список все время, вы можете использовать std::set<std::string>, который всегда сортируется (когда вы вставляете слово, оно будет помещено в нужное место)

0

вы можете сохранить словарь в

std::vector<std::pair< string,std::vector<string> > > 

структура, в которой каждый векторный элемент будет содержать символ и список слов в векторах.

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