C++ 输入流的向量?

C++ 输入流的向量?,c++,vector,ifstream,cin,istream,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 (cha

我想创建一个向量,存储不同输入流的列表,包括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));
    }
矢量注入流;
向量::迭代器streamsIterator;
streamsIterator=instream.begin();
streamsIterator=河道内插入物(streamsIterator,cin)////这有错误!
for(char i=1;argv[i]!=NULL;i++){
streamsIterator=instream.insert(streamsIterator,ifstream(argv[i],ifstream::in));
}

问题是编译器抛出了一个大错误,这个错误深入到模板库中,我无法破译。

这个程序不编译,因为您没有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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
矢量流内;
向量::迭代器streamsIterator;
streamsIterator=instream.begin();
streamsIterator=instream.insert(streamsIterator,&cin);///现在没有错误
for(char i=1;argv[i]!=NULL;i++){
auto str=新的ifstream(argv[i],ifstream::in);
streamsIterator=instream.insert(streamsIterator,str);
}
返回0;
}

这里有一些问题。首先,流是不可复制的,所以不能将其复制到容器中。虽然如果您有一个支持它的最新编译器,流是可移动的

但是,因为您希望在一个多态容器中存储不同的类型,所以甚至无法将它们移入。您不能将
std::fstream
存储在分配给
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));
    }
}
intmain(int,char*argv[]
{
std::矢量流;
IStream.push_back(&std::cin);
对于(字符**arg=argv+1;*arg;++arg)
{
IStream.push_back(新std::ifstream(*arg));
}
}
不幸的是,现在你有一个所有权问题。需要删除使用
new
创建的
std::ifstream
对象,但不应删除全局
std::cin
对象


如何解决这个问题取决于您总体上要做什么,但将需要删除的指针与不应该删除的指针混合使用是有问题的。

尝试将指向流的指针存储在向量中,而不是值流是不可复制的。只是问一个问题,为什么要使用迭代器,为什么不简单地推回?e、 g.对于(inti=0;i