2013-06-07 25 views
11

Tôi đang sử dụng vector trong chương trình C++ (và tôi là người mới bắt đầu).
Và tôi cần gửi một phần của vector đến một chức năng.Chúng tôi có thể gửi một phần vectơ làm đối số chức năng không?

Nếu nó là c tôi cần phải làm điều này (với mảng):

int arr[5] = {1, 2, 3, 4, 5}; 
func(arr+2); //to send part array {3, 4, 5} 

Có cách nào khác hơn là tạo ra một mới vector với phần cuối cùng?

+2

"* Nếu nó là c tôi cần phải làm điều này (với mảng): *" Điều đó giả định rằng 'func' biết rằng nó lấy một mảng gồm 3 phần tử (hoặc ít hơn). Nếu nó mong đợi một mảng của 5, bạn đang hơi say. –

+0

Bạn hoàn toàn có thể làm điều gì đó hoàn toàn khác. Tại sao bạn truyền dữ liệu thô xung quanh? Các vector đại diện cho những gì? Tôi sẽ đóng gói nó và thực hiện các thao tác trên nó, thay vì chuyển nó sang nơi khác. –

Trả lời

20

Cách tiếp cận chung là chuyển các phạm vi trình lặp. Điều này sẽ làm việc với tất cả các loại dao động, bao gồm cả những thuộc container tiêu chuẩn thư viện và mảng đồng bằng:

template <typename Iterator> 
void func(Iterator start, Iterator end) 
{ 
    for (Iterator it = start; it !=end; ++it) 
    { 
    // do something 
    } 
} 

sau đó

std::vector<int> v = ...; 
func(v.begin()+2, v.end()); 

int arr[5] = {1, 2, 3, 4, 5}; 
func(arr+2, arr+5); 

Note: Mặc dù chức năng làm việc cho tất cả các loại dao động, không tất cả các loại trình vòng lặp hỗ trợ gia số qua operator+ được sử dụng trong v.begin()+2. Đối với các lựa chọn thay thế, hãy xem std::advancestd::next.

+3

Tôi muốn nói rộng rãi hơn: chức năng hoạt động cho tất cả ** phạm vi **. Vùng chứa và mảng là một cách để quản lý phạm vi, nhưng chúng không phải là cách duy nhất. –

+0

@PeteBecker Điểm tốt. Đã chỉnh sửa. – juanchopanza

1
std::vector<char> b(100); 
send(z,&b[0],b.size(),0); 

Hãy thử điều này.

Read this too.

+0

Bạn có nghĩa là '& b [2]', phải không? –

+0

Đọc câu trả lời cập nhật của tôi. –

+0

Điều này làm việc tuyệt vời cho vectơ, vì chúng liền kề nhau. http: // stackoverflow.com/questions/849168/are-stdvector-elements-guaranteed-được-liên-tiếp-liên-tiếp. Chỉ cần cẩn thận không thử loại điều này với một thùng chứa không liền kề. – kmort

6

Về cơ bản, bạn có thể gửi trình lặp.

static const int n[] = {1,2,3,4,5}; 
vector <int> vec; 
copy (n, n + (sizeof (n)/sizeof (n[0])), back_inserter (vec)); 

vector <int>::iterator itStart = vec.begin(); 
++itStart; // points to `2` 
vector <int>::iterator itEnd = itStart; 
advance (itEnd,2); // points to 4 

func (itStart, itEnd); 

Điều này sẽ hoạt động với nhiều hơn chỉ vector s. Tuy nhiên, vì một vector đã đảm bảo lưu trữ contigious, chừng nào các vector không phân bổ lại bạn có thể gửi các địa chỉ của các yếu tố:

func (&vec[1], &vec[3]); 
0

Theo một số người khác đã nói, bạn có thể sử dụng vòng lặp cho điều đó. Bạn sẽ phải vượt qua sự bắt đầu của chuỗi và kết thúc chuỗi cho chức năng công nhân của bạn.

Nếu bạn cần linh hoạt hơn, bạn nên xem slice. Với slice, bạn có thể lấy ví dụ mỗi lần truy cập thứ n của vectơ.

0

Tôi cũng đã bị mắc kẹt với cùng problem.I thấy một trick.Suppose thật sự tốt đẹp bạn muốn tìm mức tối thiểu trong phạm vi L-R (cả bao gồm) của arr sau đó bạn có thể làm một cái gì đó như thế này:

vector<int>arr = {4,5,1,3,7}; 

int minVal = *min_element(begin(arr)+L,begin(arr)+(R+1)); 

Có nghĩa là bạn vượt qua toàn bộ mảng và phạm vi và sau đó bạn có thể áp dụng thủ thuật trên.

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