2012-03-21 45 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()); 
相關問題