如何使用标准stl算法从istream填充std :: vector

ami*_*421 1 c++ containers stl stl-algorithm

有一个旧的遗留代码填充istream中的向量,向量中的对象接受带有原始数据的字符串.

typedef std::vector<MyClass*> my_array;

std::istream& operator >> (std::istream& s, my_array& arr) {
   if (s) {
      std::istream_iterator<std::string> i_iter = s;
      for(++i_iter; !s.eof(); arr.push_back(new MyClass(*i_iter++)));
   }
   return s;
}
Run Code Online (Sandbox Code Playgroud)

MyClass只有ctor的样子:

MyClass(const std::string& data);
Run Code Online (Sandbox Code Playgroud)

你看到一些方法来避免写入操作符>>或任何其他函数,并使用一些(?)标准算法来填充刚刚构造的对象的容器?可能用emplace contructing替换容器中值的指针.

顺便说一句,这个用VC10编译的代码不能正常工作,当我踩到for时看起来像无限循环.然而istream(实际上这是ifstream那里)是一个小文件~200行文本

Tar*_*ama 6

你可以用std::transform.此代码需要C++ 11,如果这对您不起作用,您可以将lambda更改为工厂方法,并将别名声明更改为typedef:

using it_type = std::istream_iterator<std::string>;
std::transform(it_type{std::cin}, it_type{},
               std::back_inserter(a), [](const auto& a) { return new MyClass(a); });
Run Code Online (Sandbox Code Playgroud)