Задать вопрос

Эффективное использовование STL (C++). Как написать программу не используя циклов?

Суть вопроса заключается в том как написать программу чтения и замены в файле слов методами STL не используя при этом циклов? Конечный результат сохранить в новый файл, сохраняя при этом исходное форматирование файла.
То с чем менять слова хранится в:
map<string, string> dict;

Мои предположения строятся на использовании for_each(), find(), getline(), istringstream. Но не могу все это собрать в одно.

По сути программа является учебным переводчиком.
Вот что я сделал:

#include <iostream>
#include <iterator>
#include <fstream>
#include <map>

using namespace std;

int main()
{
    /*
     *Тут была реализация чтения файла в map без использования  циклов
     *(К вопросу не относится).
    */
    //В контейнере map содержится key - искомые слова, value - на то что надо
    //заменить при нахождении слова.
    map<string, string> dict((ifstream_pair_iter(read)), ifstream_pair_iter());
    
    return 0;
}
  • Вопрос задан
  • 2562 просмотра
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Мне кажется, что вам нужно познакомится с istream_iterator, ostream_iterator и transform. Ну и, наверно, написать один функтор.
Ответ написан
@Koss1024
#include <iterator>  // istream_iterator
#include <map>
#include <algorithm> // transform
#include <string>
#include <locale> // tolower

// Input file looks like this:
/* text.txt
You wanna play a little game?
Check this out.
*/

using namespace std;

typedef map<string, string> Vocabulary;
Vocabulary vocabulary;

string translator(string word)
{
   transform(word.begin(), word.end(), tolower); // locase

   Vocabulary::const_iterator trans = vocabulary.find(word);
   return vocabulary.end() != trans ? *trans : word;
}

void translate_file(string fin, string fout, const Vocabulary& vocabulary)
{
   ifstream in(fin);
   ifstream out(fout);

   istream_iterator<string> original_words(in);
   istream_iterator<string> eof;

   ostream_iterator<string> tranlated_words(out, " ");

   transform(original_words, eof, tranlated_words, translator);
}


int main()
{
   
   vocabulary["you"]    = "vy";
   vocabulary["wanna"]  = "hotite";
   vocabulary["game"]   = "igra";
   // ...

   translate_file("text.txt", "translated_text.txt", vocabulary);
   return 0;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы