2012-11-27 40 views
7

Tôi đang bị rắm não lúc này và tôi đang tìm kiếm một cách nhanh chóng để lấy một mảng và chuyển một nửa số đó thành một hàm. Nếu tôi có một mảng A trong mười phần tử, trong một số ngôn ngữ tôi có thể truyền một thứ gì đó như A [5:] cho hàm và được thực hiện với nó. Có một cấu trúc tương tự trong c + +? Rõ ràng tôi muốn tránh và sắp xếp chức năng lặp.Có cách nào trong C++ để lấy một mảng phụ từ một mảng không?

+6

Có lẽ chức năng của bạn nên dùng trình vòng lặp. – chris

+1

Bạn không thể chuyển mảng vào hàm trong C++ vì C++ không có giá trị mảng. Vậy chức năng của bạn thực sự là gì? – melpomene

+0

Tôi có một mảng int [] a = {1,2,3,4,5,6,7,8,9,10}. Sau đó tôi đang tìm cách để có được một mảng phụ int [] a1 = {6,7,8,9,10}. –

Trả lời

7

Có. Trong đồng bằng C bạn sử dụng con trỏ, nhưng trong C++ bạn có thể sử dụng bất kỳ loại iterator (một con trỏ có thể được coi là một iterator).

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

Bí quyết thông thường là chuyển con trỏ đến phần tử đầu tiên của mảng, sau đó sử dụng đối số riêng để truyền độ dài của mảng. Thật không may không có kiểm tra giới hạn, vì vậy bạn phải cẩn thận để làm cho nó đúng hoặc bạn sẽ scribble vào bộ nhớ của bạn.

Bạn cũng có thể sử dụng một nửa phạm vi mở. Đây là cách phổ biến nhất để làm điều đó. Nhiều chức năng trong thư viện chuẩn (như std::sort) hoạt động theo cách này.

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

Một lần nữa, không kiểm tra giới hạn.

+0

Tôi nghĩ rằng khuôn mẫu bạn đang nói đến là: 'template void func (const Iter & start, const Iter & end) {...}' – Corbin

+1

Chỉ cần 'template void func (Iter bắt đầu, Iter end)' –

+0

nếu bạn muốn kiểm tra giới hạn sử dụng truy cập có giới hạn, '& vec.at (5)' hoặc 'vec.begin() + max (5, vec.size())' nếu '5' thực sự là 'nhiều nhất là 5' . – jthill

Các vấn đề liên quan