Is there a way in C++ to get a sub array from an array?

后端 未结 2 1178
無奈伤痛
無奈伤痛 2020-12-17 20:07

I\'m having a brain fart at the moment and I am looking for a fast way to take an array and pass half of it to a function. If I had an array A of ten elements, in some langu

2条回答
  •  盖世英雄少女心
    2020-12-17 20:31

    Yes. In plain C you use pointers, but in C++ you can use any kind of iterator (a pointer can be considered an iterator).

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

    The typical trick is to pass a pointer to the first element of the array, and then use a separate argument to pass the length of the array. Unfortunately there are no bounds checks, so you have to be careful to get it right or you will scribble on your memory.

    You can also use half-open ranges. This is the most common way to do it. Many functions in the standard library (like std::sort) work this way.

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

    Again, no bounds checks.

提交回复
热议问题