2012-03-21 46 views
19

我在做什么:将矢量拆分为两个更小的数组的最佳方法?

我想将一个向量分成两个单独的数组。当前的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; 
} 

谢谢:)

+0

我会从''头(HTTP推荐一下/en.cppreference.com/w/cpp/algorithm)。 'std :: copy'或'std :: move'可能会引起人们的兴趣。 – 2012-03-21 19:11:47

+0

我喜欢这个问题。你不会经常从新用户那里看到这样的好结构化问题。 – MOnsDaR 2013-07-29 05:47:44

+0

如果你不打算改变2个数组的大小,你可以看看'array_view' – sp2danny 2016-03-09 12:26:51

回答

44

使用迭代器。

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添加到第二个开始迭代:lines.begin() + half_size不会被复制的第一个向量。


注意之类的东西

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

不是标准的C++(正因为如此不可移植)。这些都是所谓的可变长度数组(简称VLA),是C99的东西。一些编译器在编译C++代码(GCC,Clang)时将它们作为扩展。始终使用-pedantic进行编译以获得警告。这些VLA对于非POD类型非常有用,并且通常不会有用,因为你甚至不能返回它们。

+0

非常好的答案,+1为“你不需要添加1到第二个开始迭代器” – 2013-12-27 14:51:47

2

如果你只需要操纵没有他们一个参考数字,那么你可以做:

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

array_1和array_2是,实际上,指针指向向量的开始和中间。这是可行的,因为STL保证矢量将它们的元素存储在连续的存储器中。 请注意,引用lines.begin()不能用于此。

1

如果您不能使用代码Xeo答案由于严格的编译器的规则,或者您想更通用的方法,尝试std::advance:/:

#include <vector> 
#include <iterator> 

size_t middle = input.size()/2; 
std::vector<int>::const_iterator middleIter(input.cbegin()); 
std::advance(middleIter, middle); 

std::vector<int> leftHalf(input.begin(), middleIter); 
std::vector<int> rightHalf(middleIter, input.end()); 
相关问题