输入流的矢量?

时间:2015-05-18 06:53:28

标签: c++ vector ifstream cin istream

我希望创建一个存储不同输入流列表的向量,包括cin和一些文本文件。到目前为止,我有这个。

vector<istream> inStreams;
vector<istream>::iterator streamsIterator;

streamsIterator = inStreams.begin();
streamsIterator = inStreams.insert(streamsIterator, cin); ////this has error!
for (char i = 1; argv[i] != NULL; i++) {
    streamsIterator = inStreams.insert(streamsIterator, ifstream(argv[i], ifstream::in));
    }

问题在于编译器会发出一个很大的错误,这个错误深入到我无法破译的模板库中。

2 个答案:

答案 0 :(得分:2)

这里有一些问题。首先是流不是可复制的,因此您无法将它们复制到容器中。虽然如果你有一个非常新的编译器支持它,流是可移动的

但是因为你想在一个多态的容器中存储不同的类型,你甚至无法移动它们。你不能在分配给{{{{}}的空间中存储std::fstream。 1}}因为你得到slicing(腐败)。

一种方法是使用指针存储在容器中:

std::istream

不幸的是,现在您遇到所有权问题。您添加的使用int main(int, char* argv[]) { std::vector<std::istream*> istreams; istreams.push_back(&std::cin); for(char** arg = argv + 1; *arg; ++arg) { istreams.push_back(new std::ifstream(*arg)); } } 创建的std::ifstream对象需要删除,但不应删除全局new对象。

你如何解决这个问题取决于你想要做什么整体,但混合需要删除的指针与那些不应删除的指针是有问题的。

答案 1 :(得分:1)

此程序无法编译,因为您没有std :: istream类的默认构造函数。

如果使用引用而不是原始类型,则会编译此代码。从向量中删除项目时,请务必释放项目:

#include <vector>
#include <iostream>
#include <fstream>
#include <istream>

using namespace std;

int  main(int argc, char* argv[])
{
    vector<istream*> inStreams;
    vector<istream*>::iterator streamsIterator;

    streamsIterator = inStreams.begin();
    streamsIterator = inStreams.insert(streamsIterator, &cin); ////this has no error now
    for (char i = 1; argv[i] != NULL; i++) {
            auto str = new ifstream(argv[i], ifstream::in);
            streamsIterator = inStreams.insert(streamsIterator, str);
    }

    return 0;
}