2013-04-08 40 views
13

Sử dụng các mảng C bình thường tôi muốn làm một cái gì đó như thế:Đi qua vector bằng cách tham khảo

void do_something(int el, int **arr) 
{ 
    *arr[0] = el; 
    // do something else 
} 

Bây giờ, tôi muốn thay thế mảng tiêu chuẩn với vector, và đạt được kết quả tương tự ở đây:

void do_something(int el, std::vector<int> **arr) 
{ 
    *arr.push_front(el); // this is what the function above does 
} 

Nhưng nó hiển thị "biểu thức phải có loại lớp". Làm thế nào để làm điều này đúng cách?

+0

'' int ** arr''? ? làm thế nào để gán một mảng 2d trực tiếp? Nếu bạn cần mảng 2d, '' foo (vector > & arr) ''. – gongzhitaao

+1

Tôi cho rằng anh ta có lẽ đang cố gắng truyền một con trỏ tới một mảng không phải là mảng hai chiều .. sửa lỗi nếu tôi sai – Mppl

+0

Rất nhiều câu trả lời nhưng không ai nhận ra rằng đó là một mảng con trỏ, không phải là con trỏ tới mảng. Họ muốn có một 'std :: vector '. –

Trả lời

7
void do_something(int el, std::vector<int> **arr) 

nên

void do_something(int el, std::vector<int>& arr) 
{ 
    arr.push_back(el); 
} 

đèo bằng cách tham khảo đã được đơn giản hóa để sử dụng & trong C++.

+0

@taocp, ý của bạn là gì khi 'Vượt qua tham chiếu đã được đơn giản hóa để sử dụng & trong C++.'? – gen

+1

@gen Đó là imho phrasing nghèo nàn. Những gì thực sự thay đổi trong C + + là nó thực sự có pass-by-reference _at all_. C không. Nó đạt được kết quả tương tự bằng cách truyền con trỏ, và phán quyết rằng việc thay đổi kết quả của một dereference con trỏ sẽ thay đổi giá trị nhọn ở vị trí ban đầu của nó (không phải là bản sao tạm thời). Nhưng đó không phải là tham chiếu. Con trỏ được truyền theo giá trị. –

9

Nếu bạn xác định chức năng của bạn để có lập luận của std::vector<int>& arr và giá trị số nguyên, sau đó bạn có thể sử dụng push_back bên trong hàm:

void do_something(int el, std::vector<int>& arr) 
{ 
    arr.push_back(el); 
    //.... 
} 

sử dụng:

std::vector<int> arr; 
do_something(1, arr); 
1

Bạn không cần phải sử dụng ** arr, bạn có thể sử dụng:

void do_something(int el, std::vector<int> *arr){ 
    arr->push_back(el); 
} 

hoặc:

void do_something(int el, std::vector<int> &arr){ 
    arr.push_back(el); 
} 

** arr chẳng có ý nghĩa nhưng nếu bạn cứ khăng khăng sử dụng nó, làm theo cách này:

void do_something(int el, std::vector<int> **arr){ 
    (*arr)->push_back(el); 
} 

nhưng một lần nữa không có lý do để làm như vậy ...

+3

Vectơ không có 'push_front'. – Rapptz

3

Bạn có thể qua vector bằng cách tham khảo chỉ như thế này:

void do_something(int el, std::vector<int> &arr){ 
    arr.push_back(el); 
} 

Tuy nhiên, lưu ý rằng f này unction sẽ luôn luôn thêm phần tử mới ở mặt sau của vectơ, trong khi hàm mảng thực sự sửa đổi phần tử đầu tiên (hoặc khởi tạo giá trị).

Để đạt được chính xác kết quả tương tự, bạn nên viết:

void do_something(int el, std::vector<int> &arr){ 
    if (arr.size() == 0) { // can't modify value of non-existent element 
     arr.push_back(el); 
    } else { 
     arr[0] = el; 
    } 
} 

Bằng cách này, bạn có thể thêm các yếu tố đầu tiên (nếu vector rỗng) hoặc sửa đổi giá trị của nó (nếu có yếu tố đầu tiên đã tồn tại).

25

Bạn có thể chuyển vùng chứa theo tham chiếu để sửa đổi vùng chứa trong hàm. Những câu trả lời khác chưa được giải quyết là std::vector không có chức năng thành viên push_front.Bạn có thể sử dụng chức năng insert() thành viên trên vector cho O (n) chèn:

void do_something(int el, std::vector<int> &arr){ 
    arr.insert(arr.begin(), el); 
} 

Hoặc sử dụng std::deque thay thế cho khấu hao O (1) chèn:

void do_something(int el, std::deque<int> &arr){ 
    arr.push_front(el); 
} 
Các vấn đề liên quan