C++ 如何通过读取文件来填充向量?

C++ 如何通过读取文件来填充向量?,c++,string,vector,ifstream,C++,String,Vector,Ifstream,我正在尝试读取一个包含邻接列表的文件 1377916415 2123134101413 其中每行中的第一个数字是顶点,后面的数字是其相邻顶点 这是我从文件中读取的代码。我已经能够将一行放入字符串中,但不知道如何继续填充向量 ifstream ifs; string line; ifs.open("kargerMinCut.txt"); std::vector<vector <int> > CadjList(vertices); while(getline(ifs,

我正在尝试读取一个包含邻接列表的文件

1377916415
2123134101413

其中每行中的第一个数字是顶点,后面的数字是其相邻顶点

这是我从文件中读取的代码。我已经能够将一行放入字符串中,但不知道如何继续填充向量

    ifstream ifs;
string line;
ifs.open("kargerMinCut.txt");
std::vector<vector <int> > CadjList(vertices);
while(getline(ifs,line)){
}
ifs;
弦线;
ifs.open(“kargerMinCut.txt”);
std::向量CadjList(顶点);
while(getline(ifs,line)){
}

有什么建议吗?

您可以在sstream标题中使用
stringstream

ifstream ifs;
string line;
ifs.open("kargerMinCut.txt");
std::vector<vector <int> > CadjList(vertices);
while(getline(ifs,line)){

    // transfer the line contents to line_stream.
    stringstream line_stream( line );

    // transfer line_stream to int variables.
    int tail_node;
    if ( line_stream >> tail_node ) // now do whatever you want with it.
    {
        int head_node;
        while ( line_stream >> head_node )
            CadjList[tail_node].push_back( head_node );
    }    
}
ifs;
弦线;
ifs.open(“kargerMinCut.txt”);
std::向量CadjList(顶点);
while(getline(ifs,line)){
//将行内容传输到行\u流。
stringstream line_stream(线);
//将行_流传输到int变量。
int尾节点;
if(line\u stream>>tail\u node)//现在可以用它做任何事情。
{
int头节点;
while(行\u流>>头\u节点)
CadjList[尾部节点].向后推(头部节点);
}    
}

while循环中的代码:

while(std::getline(ifs,line))
{
  std::vector<int> temp;
  std::istringstream str(line);
  int n;
  while ( str >> n )
  {
     temp.push_back(n);
  }

  CadjList.push_back(temp);
}
while(std::getline(ifs,line))
{
std::向量温度;
std::istringstream str(线路);
int n;
while(str>>n)
{
温度推回(n);
}
CadjList.推回(温度);
}
使用STL的强大功能!;-)

  • 从字符串创建流
  • 把东西从一个地方复制到另一个地方(是的,它可以是通用的!)
  • 使用迭代器接口读取和写入流,与
    std::copy
    结合使用非常有用
  • 要使用
    std::copy
    ,请使用
    push_back
  • 可以使用迭代器初始化其内容
  • 如果顶点不是从0开始的连续范围,则可能比std::vector更好
它给出了类似于:

// vertex -> adjacent vertices
std::map<int, std::vector<int>> map;

std::string line;
while (std::getline(ifs, line))
{
    std::istringstream is(line);
    std::vector<int> ns;
    std::copy(std::istream_iterator<int>(is), std::istream_iterator<int>(), 
              std::back_inserter(ns));

    assert(ns.size() > 1); // or throw something

    // The first is the vertex
    map[ns[0]] = std::vector<int>(ns.begin() + 1, ns.end());
}
//顶点->相邻顶点
地图;
std::字符串行;
while(std::getline(ifs,line))
{
std::istringstream是(行);
std::载体ns;
std::copy(std::istream_迭代器(is),std::istream_迭代器(),
标准:背部插入器(ns);
断言(ns.size()>1);//或抛出某些内容
//第一个是顶点
map[ns[0]=std::vector(ns.begin()+1,ns.end());
}

替代实现,假设文件未损坏:

// vertex -> adjacent vertices
std::map<int, std::vector<int>> map;

std::string line;
while (std::getline(ifs, line))
{
    std::istringstream is(line);
    std::vector<int> ns;

    // assuming we know for sure the file is valid
    auto it = std::istream_iterator<int>(is);
    auto end = std::istream_iterator<int>();
    auto vertex = *(it++); // and not ++it !
    map[vertex] = std::vector<int>(it, end);
}
//顶点->相邻顶点
地图;
std::字符串行;
while(std::getline(ifs,line))
{
std::istringstream是(行);
std::载体ns;
//假设我们确定文件是有效的
自动it=std::istream_迭代器(is);
auto end=std::istream_迭代器();
自动顶点=*(它++);//而不是++它!
映射[顶点]=std::vector(it,end);
}


一般来说,它包含了很多好的函数。

循环时从
中的每一行构建一个
std::istrstream
,并不断读取其中的数字,直到没有为止。@RSahu你能发布一些代码吗???@RSahu:糟糕的建议<代码>std::istrstream
对指针进行操作,在C++98中已被弃用。请看@ChristianHackl,这是一个打字错误。我的意思是建议
std::istringstream
@Abhishek_Bansal Dude,我在执行上述代码时遇到分段错误(内核转储)。我甚至对CadjList[tail\u node]行进行了注释;并且刚刚打印了tail_节点,但仍然存在相同的错误。如果顶点索引从1开始,而不是从0开始,则应将该行修改为CadjList[tail_节点-1]。将_向后推(head_节点);或者你应该形成一个(1+顶点)向量的向量,而不是(顶点)向量。你应该习惯于使用
istringstream
ostringstream
,这取决于你是需要输入还是需要输出,而不是常规的
stringstream
。文件格式是特定的,其中每行表示邻接列表。您不能一个接一个地插入所有元素。@AbhishekBansal然后您不理解我的代码:
ns
被复制到
map
中,第一个元素作为键,其余元素作为值。啊,好吧,抱歉我误解了。我添加了另一个impl,它可能更容易阅读,但不太健壮。