2012-11-27 3 views
7

私は現時点で脳のおならを持っており、配列をとり、関数の半分を関数に渡すための高速な方法を探しています。いくつかの言語で配列Aが10個ある場合、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

あなたが話していたテンプレートは次のようなものだと思います:テンプレート void func(const Iter&start、const Iter&end){...} ' – Corbin

+1

テンプレート' typename Iter> void func(Iter start、Iter end) ' –

+0

'5'が実際に '最大5'である場合、境界チェックで境界チェックされたアクセスを使用するには、 '&vec.at(5) 'または' vec.begin()+ max(5、vec.size() 。 – jthill

関連する問題