C ++容器拆分

时间:2013-12-09 17:16:42

标签: c++ file list vector containers

我在文本文件中有一个未知数量的int变量,我所知道的是变量的数量是6的倍数。

我想将这些文件读入容器,然后将它们拆分为较小的容器,每个容器需要6个值。

例如,如果文本文件中有30个变量,我想要5个容器,每个容器包含6个变量。它们需要按照它们在文件中的顺序,即第一个容器保存前六个值。

我已经将文件读入列表,暂时传真,并且正在徘徊哪一个更适合。我已经阅读过关于分割功能的内容了,但是看了看之后,我还没能成功地将它应用于其中一个尝试,主要是因为我不知道我需要多少个小容器

到目前为止,这是我的代码:

矢量方法

std::vector<int> Ticket;

std::ifstream fin (username + "Ticket.txt");
    while (!fin.eof())
    {
        fin >> num;
        Ticket.push_back(num);
    }
    fin.close();

Ticket.shrink_to_fit();

列表方法

std::list<int> Ticket1;

std::ifstream fin (username + "Ticket.txt");
    while (!fin.eof())
    {
        fin >> num;
        Ticket1.push_back(num);
    }
    fin.close();

或者,如果我能以某种方式从文件中直接读取6个值到较小的容器中,并继续这样做直到文件的末尾,因此跳过那个很棒的大容器。

4 个答案:

答案 0 :(得分:2)

您可以使用矢量矢量。

std::vector< std::vector<int> > Ticket;
std::vector<int> newVector;    

std::ifstream fin (username + "Ticket.txt");
while ( fin >> num )
{
  newVector.push_back( num );

  // if the vector is full, then insert it and start afresh
  if ( newVector.size() == 6 ) { 
    Ticket.push_back( newVector );
    newVector.clear();
  }    
}
fin.close();

最后,故障单向量应包含所有必需的向量。

要将每个向量打印到控制台,请使用两个嵌套循环:

for ( int i = 0; i < Ticket.size(); i++ ) { // outer vector
  for ( int j = 0; j < Ticket[i].size(); j++ ) { // inner vectors
    std::cout << Ticket[i][j] << " ";
  }
  std::cout << "\n";
}

答案 1 :(得分:1)

如果你创建了一个临时累加器,那么你的最终目的地是:

vector<int> temp ;
vector<vector<int>> package ;

然后填写temp,直到它完整,并推到package的末尾:

while ( fin >> num )
{
  temp.push_back( num) ;
  if ( temp.size() == MyDesiredSize ) { package.push_back( temp) ;  temp.clear() ; }
}

push_back package它会复制,这就是您之后可以清除temp的原因。

答案 2 :(得分:1)

您是否需要容器内的值是连续的,因为它们在c-array中,或者您是否需要使用std :: vector的reserve成员函数来更好地控制内存分配?如果没有,那么考虑deque或列出向量。 http://www.cplusplus.com/reference/deque/deque/

如果您有支持它的C ++ 11编译器,也可以使用固定大小的数组。 http://www.cplusplus.com/reference/array/array/

例如,您可以设置这样的容器来设置数组列表。

std::list<std::array<int, 6>> containersOfSix;

另一方面,如果您希望容器的两个部分都是动态的,则可以使用其中一个插入器功能。
http://www.cplusplus.com/reference/iterator/istream_iterator/ http://www.cplusplus.com/reference/iterator/insert_iterator/

考虑阅读这些材料,并尝试使用其中的一些选项。这可能会导致您搜索与其相关的其他线程,这将帮助您找到更具体的示例。

答案 3 :(得分:0)

我会使用C函数Fscanf()

您可以使用格式并一次读取6个数字。

fscanf(FILE,"%i %i %i %i %i %i",&var1,&var2,&var3,&var4,&var5,&var6)

然后你只需要处理容器,在之前创建一个容器并直接读取容器,或者如果它们符合您的预期,则应对它们。