1. ホーム
  2. c++

[解決済み] C++で、配列から部分配列を取得する方法はありますか?

2022-02-15 09:24:59

質問

私は今、頭を悩ませていて、配列を受け取ってその半分を関数に渡す速い方法を探しています。10個の要素からなる配列Aを持っている場合、ある言語ではA[5:]のようなものを関数に渡して終了します。c++で同じような構成はあるのでしょうか?もちろん、ループするような関数は避けたいのですが。

どのように解決するのですか?

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;
}

ここでも、バウンズチェックなし。