2012-11-27 77 views
7

我現在有一個大腦放屁,我正在尋找一種快速方法來獲取數組並將其中一半傳遞給函數。如果我有十個元素的數組A,在某些語言中,我可以將A [5:]這樣的東西傳遞給函數並完成它。在C++中是否有類似的構造?顯然,我想避免和排序循環功能。C++中有從數組中獲取子數組的方法嗎?

+6

也許你的函數應該使用迭代器。 – chris

+1

您不能將數組傳遞給C++中的函數,因爲C++沒有數組值。那麼你的功能實際上是什麼? – melpomene

+0

我會有一個數組int [] a = {1,2,3,4,5,6,7,8,9,10}。然後,我正在尋找一種方法來獲取子數組int [] a1 = {6,7,8,9,10}。 –

回答

7

是的。在普通的C中使用指針,但在C++中,可以使用任何類型的迭代器(指針可以被視爲迭代器)。

template<typename Iter> 
void func(Iter arr, size_t len) { ... } 

int main() { 
    int arr[10]; 
    func(arr, 10); // whole array 
    func(arr, 5);  // first five elements 
    func(arr + 5, 5); // last five elements 

    std::vector<Thing> vec = ...; 
    func(vec.begin(), vec.size());   // All elements 
    func(vec.begin(), 5);     // first five 
    func(vec.begin() + 5, vec.size() - 5); // all but first 5 

    return 0; 
} 

典型訣竅是將指針傳遞到所述陣列的所述第一元件,然後使用單獨的參數來傳遞數組的長度。不幸的是,沒有界限檢查,所以你必須小心地把它弄清楚,否則你會記憶猶新。

您也可以使用半開範圍。這是最常見的方式。標準庫中的許多功能(如std::sort)都以這種方式工作。

template<class Iter> 
void func(Iter start, Iter end) { ... } 

int main() { 
    int arr[10]; 
    func(arr, arr + 10);  // whole array 
    func(arr, arr + 5);  // first five elements 
    func(arr + 5, arr + 10); // last five elements 

    std::vector<Thing> vec = ...; 
    func(vec.begin(), vec.end());  // whole vector 
    func(vec.begin(), vec.begin() + 5); // first five elements 
    func(vec.begin() + 5, vec.end()); // all but the first five elements 

    return 0; 
} 

再次,沒有邊界檢查。

+0

我認爲你所說的模板是:'template void func(const Iter&start,const Iter&end){...}' – Corbin

+1

只是'template void func(Iter start,Iter end)' –

+0

如果你想要邊界檢查,使用邊界檢查的訪問,如果'5'真的是'最多5',那麼'&vec.at(5)'或者'vec.begin()+ max(5,vec.size())' 。 – jthill