1

我正在处理这个源代码:

#include <string>
#include <vector>
#include <iostream>
#include <istream>
#include <ostream>
#include <iterator>
#include <sstream>
#include <algorithm>

int main()
{
  std::string str = "The quick brown fox";

  // construct a stream from the string
  std::stringstream strstr(str);

  // use stream iterators to copy the stream to the vector as whitespace separated strings
  std::istream_iterator<std::string> it(strstr);
  std::istream_iterator<std::string> end;
  std::vector<std::string> results(it, end);

  // send the vector to stdout.
  std::ostream_iterator<std::string> oit(std::cout);
  std::copy(results.begin(), results.end(), oit);
}

它不是对单行进行标记并将其放入向量结果中,而是对从该文本文件中取出的一组行进行标记并将结果单词放入单个向量中。

Text File:
Munroe states there is no particular meaning to the name and it is simply a four-letter word without a phonetic pronunciation, something he describes as "a treasured and carefully-guarded point in the space of four-character strings." The subjects of the comics themselves vary. Some are statements on life and love (some love strips are simply art with poetry), and some are mathematical or scientific in-jokes.

到目前为止,我只清楚我需要使用

while (getline(streamOfText, readTextLine)){} 

让循环运行。

但我认为这行不通:

while (getline(streamOfText, readTextLine)) { cout << readTextLine << endl;

// 从字符串构造一个流 std::stringstream strstr(readTextLine);

// 使用流迭代器将流作为空格分隔的字符串复制到向量 std::istream_iterator it(strstr); std::istream_iterator 结束;std::vector 结果(它,结束);

/*HOw CAN I MAKE THIS INSIDE THE LOOP WITHOUT RE-DECLARING AND USING THE CONSTRUCTORS FOR THE ITERATORS AND VECTOR? */

  // send the vector to stdout.
  std::ostream_iterator<std::string> oit(std::cout);
  std::copy(results.begin(), results.end(), oit);

          }
4

1 回答 1

1

是的,那么您在readTextLine. 这是你在那个循环中想要的吗?然后不是从 istream 迭代器构造向量,而是复制到向量中,并在循环外定义向量:

std::vector<std::string> results;
while (getline(streamOfText, readTextLine)){
    std::istringstream strstr(readTextLine);
    std::istream_iterator<std::string> it(strstr), end;
    std::copy(it, end, std::back_inserter(results));
}

如果您只需要来自流的所有单词,并且不需要每行处理,那么您实际上不需要先将一行读入字符串。就像您在代码中所做的那样直接从另一个流中读取。它不仅会从一行中读取单词,还会从整个流中读取单词,直到文件结尾:

std::istream_iterator<std::string> it(streamOfText), end;
std::vector<std::string> results(it, end);

要手动完成所有这些操作,就像您在评论中要求的那样,请执行

std::istream_iterator<std::string> it(streamOfText), end;
while(it != end) results.push_back(*it++);

我建议你读一本关于这方面的好书。我认为它将向您展示更多有用的技术。Josuttis 的C++ 标准库是一本好书。

于 2009-01-27T21:48:39.277 回答