Попытка реализовать итератор без явного контейнера - PullRequest
1 голос
/ 16 июня 2011

После моего недавнего вопроса я пытаюсь реализовать свой собственный надуманный пример.
У меня есть базовая структура, но даже после прочтения это , что, вероятно,лучший учебник, который я видел, я все еще в замешательстве.Я думаю, что мне, вероятно, следует преобразовать Chapter._text в поток, и для оператора приращения сделать что-то вроде

string p = "";
string line;
while ( getline(stream, line) ) {
    p += line;
}
return *p;

, но я не уверен, какую из «шаблонных» типов использовать и как всеэти вещи вместе.Большое спасибо за вашу помощь

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class Paragraph {
public:
  string _text;

  Paragraph (string text) {
    _text = text;
  }
};

class Chapter {
public:
  string _text;

  /*  // I guess here I should do something like:
  class Iterator : public iterator<input_iterator_tag, Paragraph> {

  }
  // OR should I be somehow delegating from istream_iterator ? */

  Chapter (string txt_file) {
    string line;

    ifstream infile(txt_file.c_str());
    if (!infile.is_open()) {
      cout << "Error opening file " << txt_file << endl;
      exit(0);
    }
    while ( getline(infile, line) ) {
      _text += (line + "\n");
    }
  }

};

int main(int argc, char** argv) {
  Chapter c(argv[1]);

  // want to do something like:
  // for (<Paragraph>::iterator pIt = c.begin(); pIt != c.end(); pIt++) {
  //    Paragraph p(*pIt);
  //    // Do something interesting with p
  // }

  return 0;
}

1 Ответ

1 голос
/ 19 июля 2011

Поскольку вы не планировали загрузку главы за один раз (просто абзац), а ваш абзац пуст, я думаю, что лучше всего это сделать с помощью одного класса абзаца_тератораПоток инкапсулируется в итераторе, так что если у нас есть два итератора в одном файле, оба получат каждую строку.Если у вас есть отдельный класс Chapter с двумя итераторами, у вас могут возникнуть проблемы с многопоточностью.Это довольно простой код, и он полностью не проверен.Я уверен, что есть способ сделать это с копируемыми итераторами, но гораздо сложнее.

В общем, реализация класса итератора тесно связана со структурой данных, по которой он переходит.В противном случае у нас было бы всего несколько общих классов итераторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...