2014-07-22 23 views
8

Trong đoạn mã dưới đây, kích thước của hàm (foo) đối số (std::vector) có thể là bất cứ điều gì để làm cho hàm thành một hàm chung. Tuy nhiên, đôi khi kích thước container được biết đến như vậy std :: mảng có thể được sử dụng. Vấn đề là chuyển đổi std::array thành std::vector. Cách tốt nhất để giải quyết vấn đề này là gì? Có tốt hơn khi chỉ sử dụng std::vector trong trường hợp này không?Chuyển đổi std :: mảng thành std :: vector

#include <iostream> 
#include <array> 
#include <vector> 

using namespace std; 

// generic function: size of the container can be anything 
void foo (vector<int>& vec) 
{ 
    // do something 
} 

int main() 
{ 
    array<int,3> arr; // size is known. why use std::vector? 
    foo (arr); // cannot convert std::array to std::vector 

    return 0; 
} 
+1

Tôi giả định rằng 'foo' sửa đổi vectơ vì nó mất bởi tham chiếu có thể thay đổi, đúng không? Điều đó sẽ rất phù hợp với câu trả lời. –

+0

Bây giờ bạn sẽ phải làm việc xung quanh nó, nhưng trong tương lai chúng tôi sẽ viết một cái gì đó như 'void foo (RangeOf &);' và nó sẽ có bất kỳ loại phạm vi 'int'. –

+1

Vấn đề này là lý do tại sao thư viện chuẩn luôn có các trình vòng lặp 'bắt đầu' và' cuối'. Bằng cách đó, nó không quan tâm bạn sử dụng container nào. –

Trả lời

15

Cho rằng bạn vượt qua trong một array, foo dường như không thay đổi kích thước thùng chứa nó được thông qua năm (tuy nhiên, nó dường như thay đổi các yếu tố kể từ vec được truyền không const). Do đó, nó không cần phải biết bất cứ điều gì về các container bên dưới khác với cách truy cập các phần tử.

Sau đó, bạn có thể chuyển một cặp vòng lặp (và làm cho trình vòng lặp nhập một đối số mẫu), như nhiều thuật toán STL thực hiện.

+0

Ngoài ra, nếu bạn muốn tránh tạo mẫu, các tham số có thể là 'int * first' và' size_t count' –

+3

@MooingDuck: 'int * bắt đầu, int * end' sẽ là C++ isher hơn' int * first, size_t count'. – Nawaz

0

Hàm này chấp nhận một véc tơ theo tham chiếu. Vì vậy, không có bất kỳ ý nghĩa để vượt qua một đối tượng của loại std :: mảng chức năng. Nó có thể có một ý nghĩa nếu tham số của hàm sẽ được định nghĩa là tham chiếu const tới một vectơ.

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