将矢量分成两个较小数组的最佳方法是什么?

mig*_*db1 24 c++ split fstream stdvector

我正在做的事情:

我试图将一个矢量分成两个独立的数组.当前int向量包含文本文件中每行的元素.文本文件是随机整数列表.

我打算怎么做:

我目前的想法是创建两个常规int数组,然后迭代整个向量并将n/2个元素复制到每个数组.

我想知道的是:

完成任务的最优雅方式是什么?我有一种感觉,我可以做到这一点,而无需多次迭代矢量.

码:

#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
using namespace std;

vector<int> ifstream_lines(ifstream& fs)
{
  vector<int> out;
  int temp;
  while(fs >> temp)
  {
    out.push_back(temp);
  }
  return out;
}

vector<int> MergeSort(vector<int>& lines)
{
  int split = lines.size() / 2;
  int arrayA[split];
  int arrayB[split];
}

int main(void) 
{
  ifstream fs("textfile.txt");
  vector<int> lines;
  lines = ifstream_lines(fs);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

Xeo*_*Xeo 60

使用迭代器.

std::vector<int> lines;
// fill
std::size_t const half_size = lines.size() / 2;
std::vector<int> split_lo(lines.begin(), lines.begin() + half_size);
std::vector<int> split_hi(lines.begin() + half_size, lines.end());
Run Code Online (Sandbox Code Playgroud)

由于迭代器范围表示半开放范围[begin, end),因此不需要向第二个开始迭代器添加1:lines.begin() + half_size不会复制到第一个向量.


注意事情就好

int split = lines.size() / 2;
int arrayA[split];
int arrayB[split];
Run Code Online (Sandbox Code Playgroud)

不是标准的C++(因此不是可移植的).这些是所谓的可变长度数组(简称VLA),是C99的东西.一些编译器在编译C++代码(GCC,Clang)时将它们作为扩展.始终编​​译-pedantic以获得警告.这些VLA对非POD类型起作用,并且通常不常用,因为您甚至无法返回它们.