Saya membuat kode dalam C ++. Jika saya memiliki beberapa fungsi void foo(vector<int> test)
dan saya menyebutnya dalam program saya, apakah vektor akan diteruskan oleh nilai atau referensi? Saya tidak yakin karena saya tahu vektor dan array serupa dan fungsi seperti itu void bar(int test[])
akan lulus uji dengan referensi (pointer?), Bukan dengan nilai. Dugaan saya adalah bahwa saya harus melewatkan vektor dengan pointer / referensi secara eksplisit jika saya ingin menghindari lewat nilai tetapi saya tidak yakin.
97
Jawaban:
Jika saya harus menebak, saya akan mengatakan bahwa Anda berasal dari latar belakang Java. Ini adalah C ++, dan hal-hal diteruskan oleh nilai kecuali jika Anda menetapkan sebaliknya menggunakan
&
-operator (perhatikan bahwa operator ini juga digunakan sebagai operator 'alamat-dari', tetapi dalam konteks yang berbeda). Ini semua terdokumentasi dengan baik, tetapi saya akan mengulangi lagi:void foo(vector<int> bar); // by value void foo(vector<int> &bar); // by reference (non-const, so modifiable inside foo) void foo(vector<int> const &bar); // by const-reference
Anda juga dapat memilih untuk meneruskan penunjuk ke vektor (
void foo(vector<int> *bar)
), tetapi kecuali Anda tahu apa yang Anda lakukan dan Anda merasa bahwa inilah cara yang tepat, jangan lakukan ini.Juga, vektor tidak sama dengan array! Secara internal, vektor melacak larik yang menangani manajemen memori untuk Anda, tetapi begitu juga banyak container STL lainnya. Anda tidak dapat meneruskan vektor ke fungsi yang mengharapkan pointer atau array atau sebaliknya (Anda bisa mendapatkan akses ke (pointer ke) array yang mendasari dan menggunakannya). Vektor adalah kelas yang menawarkan banyak fungsi melalui fungsi anggotanya, sedangkan pointer dan array adalah tipe bawaan. Juga, vektor dialokasikan secara dinamis (yang berarti bahwa ukurannya dapat ditentukan dan diubah saat runtime) sedangkan array gaya-C dialokasikan secara statis (ukurannya konstan dan harus diketahui pada waktu kompilasi), membatasi penggunaannya.
Saya sarankan Anda membaca lebih lanjut tentang C ++ secara umum (khususnya peluruhan array ), dan kemudian lihat program berikut yang menggambarkan perbedaan antara array dan pointer:
void foo1(int *arr) { cout << sizeof(arr) << '\n'; } void foo2(int arr[]) { cout << sizeof(arr) << '\n'; } void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; } void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; } int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; foo1(arr); foo2(arr); foo3(arr); foo4(arr); }
sumber
A
vector
secara fungsional sama dengan array. Tapi, bahasavector
adalah tipe, danint
juga tipe. Untuk argumen fungsi, semua tipe array (termasukvector[]
) diperlakukan sebagai penunjuk. Avector<int>
tidak sama denganint[]
(ke kompilator).vector<int>
adalah non-array, non-reference, dan non-pointer - itu dilewatkan oleh nilai, dan karenanya akan memanggil copy-constructor.Jadi, Anda harus menggunakan
vector<int>&
(sebaiknya denganconst
, jika fungsi tidak memodifikasinya) untuk meneruskannya sebagai referensi.sumber
void foo(vector<int> test)
vektor akan melewati nilai ini.
Anda memiliki lebih banyak cara untuk meneruskan vektor tergantung pada konteksnya: -
1) Lewati referensi: - Ini akan membiarkan fungsi foo mengubah konten vektor Anda. Lebih efisien daripada nilai lewat karena penyalinan vektor dihindari.
2) Lewati referensi-konst: - Ini efisien dan juga dapat diandalkan ketika Anda tidak ingin berfungsi untuk mengubah konten vektor.
sumber
ketika kita melewatkan vektor dengan nilai dalam suatu fungsi sebagai argumen, itu hanya membuat salinan vektor dan tidak ada efek yang terjadi pada vektor yang didefinisikan dalam fungsi utama ketika kita memanggil fungsi tertentu itu. sedangkan ketika kita melewatkan vektor dengan referensi apa pun yang tertulis dalam fungsi tertentu itu, setiap tindakan akan dilakukan pada vektor yang didefinisikan dalam fungsi utama atau lainnya ketika kita memanggil fungsi tertentu itu.
sumber