将向量分割成两个较小数组的最佳方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (214)

我想做的是:

我试图将一个向量分割成两个独立的数组。当前的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;
}
提问于
用户回答回答于

使用迭代器。

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());

因为迭代器范围代表半开范围。[begin, end),您不需要将1添加到第二个BEGIN迭代器中:lines.begin() + half_size不会复制到第一个向量。

int split = lines.size() / 2;
int arrayA[split];
int arrayB[split];

不是标准的C++(因此也不是可移植的)。这些都是所谓的可变长度数组(简称VLA),是C99的东西。一些编译器在编译C++代码(GCC、Clang)时将它们作为扩展。总是用-pedantic得到警告。对于非POD类型,这些VLA表现得很时髦,而且通常并不有用,因为您甚至不能返回它们。

用户回答回答于

如果只需要引用数字而不需要对它们进行操作,那么您可以这样做:

int *array_1 = &lines[0];
int *array_2 = &lines[lines.size() / 2];

阵列_1和数组_2实际上是指向向量开始和中间的指针。这是因为STL保证向量将它们的元素存储在一个连续的内存中。

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问9 回答
  • 优惠活动秘书

    0 粉丝2 提问8 回答
  • 最爱开车啦

    8 粉丝503 提问6 回答
  • 富有想象力的人

    3 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券