2015-03-27 3 views
0

Вот функция, которую я пишу, для синтаксического анализа строки слов в набор слов.Разбор строки слов в набор слов

std::set<std::string> parseStringToWords(string rawWord) 
{ 
    getline(cin,rawWord); 
    std::set<std::string> myset; 
    istringstream iss(rawWord); 
    string word; 
    while(iss >> word) { 
     myset.insert(word); 
    } 
} 

Я довольно уверен, что я имею право так далеко, но я не уверен, что делать в то время цикла. Любые намеки?

+0

Передайте каждое слово выходному итератору. Может быть, определить удобную оболочку, которая использует это, чтобы вернуть вектор слов. –

+0

Извините, но я действительно новичок в C++. Есть ли более простой способ или вы можете объяснить свой путь? –

+0

Поскольку вам нужно вернуть набор, вы должны объявить его. Затем вставьте в него значения в свой цикл и верните его, когда цикл закончится. –

ответ

2

Вот код, мы надеемся, приведет вас в хороших направлениях:

#include <iostream> 
#include <string>    // std::string 
#include <set>     // std::set 
#include <sstream>    // std::istringstream 

namespace my { 
    using std::cin; 
    using std::cout; 
    using std::istringstream; 
    using std::set; 
    using std::string; 

    auto set_of_words(const string& s) 
     -> set<string> 
    { 
     set<string> result; 
     istringstream iss(s); 
     string word; 
     while(iss >> word) 
     { 
      result.insert(word); 
     } 
     return result; 
    } 

    auto getline(const string& prompt) 
     -> string 
    { 
     string result; 
     cout << prompt; 
     getline(cin, result); 
     return result; 
    } 
} // namespace my 

auto main() -> int 
{ 
    using namespace my; 
    using namespace std; 

    const set<string> words = set_of_words(getline("A line of words, please: ")); 
    cout << "You entered these unique_words:" << endl; 
    for(const string word : words) 
    { 
     cout << "* " << word << endl; 
    } 
} 

Основная проблема с этим кодом является то, что он не проверяет или обработки сбоев. В профессиональной работе большая часть кода часто связана с проверкой и обработкой ошибок. В частности, функция my::getline должна не просто молча возвращать результат при сбое ввода.

Другой проблемой является отсутствие повторного использования из-за отсутствия абстракции. Как я уже упоминал в комментарии к вопросу, естественным способом для опытного программиста является передача функции split-to-words через слова в выходной итератор. Затем это облегчает как прямое использование для различных целей, таких как вывод слов по одной линии или добавление их в набор, либо размещение их в конце вектора & hellip ;; и это облегчает кодирование удобных оберток для таких целей. Что еще более важно, это общий принцип, который просто не нуждается в ограничении для представления данных. Но, с другой стороны, не растрачивая работу на надежное обобщение, потому что в конце концов можно обнаружить, что оно не используется.