2012-11-27 51 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