Dari mana array berasal? Biasanya fungsi yang mengambil array juga membutuhkan parameter panjang untuk menangani masalah ini.
Michael Myers
2
Yah, saya membuat program "mad libs" yang memiliki larik dengan semua teks, serta lokasi kata benda / kata kerja yang harus diisi oleh pengguna. Saya ingin menggunakan fungsi untuk menjalankan melalui seluruh array, mengganti nilai "[kata benda]" dan "[kata kerja]" dengan teks yang dimasukkan oleh pengguna.
Harap dicatat bahwa dalam array C bukan objek atau struktur. Dengan demikian, mereka tidak memiliki parameter panjang yang disimpan di mana saja secara default. Jika Anda ingin bekerja dengannya sebagai objek di C ++, gunakan objek C ++ std :: vector, atau std :: array dari C ++ 11 jika Anda bisa. Jika Anda harus menggunakan pointer, selalu berikan panjang array sebagai parameter kedua untuk setiap fungsi yang bekerja dengannya.
Pihhan
Jika Anda menggunakan C ++ 20, maka saya telah menambahkan jawaban untuk itu juga. Ini bisa dilewatkan dengan mudah karena ada begitu banyak jawaban di sini.
gprathour
Jawaban:
511
Jika maksud Anda adalah array gaya-C, maka Anda dapat melakukan sesuatu seperti:
int a[7];
std::cout <<"Length of array = "<<(sizeof(a)/sizeof(*a))<< std::endl;
Ini tidak berfungsi pada pointer (artinya tidak akan berfungsi untuk salah satu dari berikut ini):
int*p =newint[7];
std::cout <<"Length of array = "<<(sizeof(p)/sizeof(*p))<< std::endl;
Ini juga tidak berfungsi jika Anda melewatkan array ke fungsi yang berbeda dan mencoba melakukannya di sana :)
San Jacinto
23
@ Sam Jacinto: Tidak, ini berfungsi (pada array ) tidak peduli apa fungsi Anda. Melewati array dengan panjang variabel ke suatu fungsi sebagai parameter, bagaimanapun, adalah tidak mungkin (ia meluruh menjadi pointer) - tetapi jika Anda melewatkan sebuah array di dalam struct, maka ini berfungsi seperti yang diharapkan.
Persamaan
1
@OliverCharlesworth juga jika Anda melewatkan array dengan nilai ke fungsi lain dan mencobanya di sana, itu tidak akan berfungsi, kan? Pertanyaannya adalah mengapa
A_Matar
5
@A_Matar - Anda tidak bisa melewatkan array dengan nilai dalam C atau C ++.
Oliver Charlesworth
1
@ Yususha - mereka adalah hal yang sama.
Oliver Charlesworth
142
Seperti yang dikatakan orang lain, Anda dapat menggunakan sizeof(arr)/sizeof(*arr)tetapi ini akan memberi Anda jawaban yang salah untuk tipe pointer yang bukan array.
Ini memiliki properti bagus gagal dikompilasi untuk jenis non array (visual studio memiliki _countofyang melakukan ini). Itu constexprmembuat ini ekspresi waktu kompilasi sehingga tidak memiliki kelemahan atas makro (setidaknya tidak saya tahu).
Anda juga dapat mempertimbangkan menggunakan std::arraydari C ++ 11 yang memaparkan panjangnya tanpa overhead di atas array C asli.
C ++ 17 memiliki std::size()di <iterator>header yang melakukan hal yang sama dan berfungsi untuk wadah STL juga (terima kasih kepada @Jon C ).
@ Ya bagaimana Anda menulis referensi ke array , lihat jawaban ini . Versi saya terlihat sedikit berbeda karena saya telah meninggalkan nama parameter karena parameter tidak digunakan, hanya jenisnya yang diperlukan. Dengan nama itu akan menjadi T(arg&)[N].
Motti
1
Terima kasih, Motti! Nama parameter yang ditinggalkan sudah jelas bagi saya. Tetapi sulit dipercaya bahwa saya tampaknya tidak menggunakan referensi / pointer ke array sebelumnya. Dan mungkin tidak akan di masa depan, karena array seperti itu semakin berkurang.
@IsaacPascual Saya tidak terbiasa dengan itu extent, melihat itu sekarang ada dua karakteristik dengan itu yang membuatnya kurang berguna daripada fungsi di atas (untuk usecase ini). (1) Mengembalikan nol untuk pointer (bukan kesalahan kompilasi). (2) Membutuhkan parameter tipe sehingga untuk memeriksa variabel yang harus Anda lakukandecltype
Motti
86
Melakukan sizeof( myArray )akan memberi Anda jumlah total byte yang dialokasikan untuk array itu. Anda kemudian bisa mengetahui jumlah elemen dalam array dengan membaginya dengan ukuran satu elemen dalam array:sizeof( myArray[0] )
Ini adalah solusi yang sangat sederhana dan mudah untuk mengatasi apa yang tampaknya menjadi masalah lama.
4
Tidak berfungsi untuk array C ++ "baru" yang dipegang oleh pointer. Anda mendapatkan ukuran pointer (4 byte) atau ukuran elemen pertama jika Anda melakukan dereferensi.
DragonLord
1
@ LordLord ya, meskipun siapa pun yang menyatakan ukuran array menggunakan kata kunci baru sudah akan tahu ukuran array saat runtime, jadi tidak perlu menggunakan sizeof operator untuk menemukan ukuran array dalam kasus itu. Saya yakin Anda tahu itu. Ini hanya untuk kepentingan siapa saja yang tidak.
Martyn Shutt
@surega Itu tidak akan crash
CITBL
60
Meskipun ini adalah pertanyaan lama, ada baiknya memperbarui jawaban untuk C ++ 17. Di perpustakaan standar sekarang ada fungsi templated std::size(), yang mengembalikan jumlah elemen dalam wadah std atau array gaya-C. Sebagai contoh:
Ini tidak akan berfungsi untuk ukuran array individual variabel
Don Larynx
4
+1 untuk vektor. Ada beberapa kasus kuat untuk menggunakan array C ++ gaya lama lagi. Kecuali jika ukuran array tidak akan pernah berubah, tetapi meskipun demikian, Anda harus menggunakan kelas wadah array. Lebih baik menggunakan kelas kontainer seperti vektor untuk penyimpanan array dinamis. Kelebihan menggunakan kelas kontainer jauh lebih buruk daripada keharusan mengelola memori Anda sendiri.
Martyn Shutt
@ MartynShutt Ketika Anda terikat cache, seperti di gamedev, Anda terkadang tidak mampu menggunakan vektor.
Tara
30
std::vectormemiliki metode size()yang mengembalikan jumlah elemen dalam vektor.
Saya percaya ini hanya berfungsi untuk variabel lokal yang ada di stack.
DragonLord
Ini jawaban terbaik. @DragonLord, ini berfungsi untuk vars anggota juga. Lihat cpp.sh/92xvv .
Shital Shah
24
Sejak C ++ 11, beberapa template baru diperkenalkan untuk membantu mengurangi rasa sakit ketika berhadapan dengan panjang array. Semuanya didefinisikan dalam tajuk <type_traits>.
Jika Tmerupakan tipe array, berikan nilai konstanta anggota sama dengan jumlah elemen di sepanjang Ndimensi th array, jika Ndalam [0, std::rank<T>::value). Untuk jenis lain, atau jika Tarray yang tidak diketahui terikat sepanjang dimensi pertama dan N0, nilainya 0.
Jika Tadalah array dari beberapa tipe X, berikan tipe typedef anggota sama dengan X, jika tidak tipe adalah T. Perhatikan bahwa jika Tarray multidimensi, hanya dimensi pertama yang dihapus.
Di C ++, menggunakan kelas std :: array untuk mendeklarasikan sebuah array, orang dapat dengan mudah menemukan ukuran array dan juga elemen terakhir.
#include<iostream>#include<array>int main(){
std::array<int,3> arr;//To find the size of the array
std::cout<<arr.size()<<std::endl;//Accessing the last elementauto it=arr.end();
std::cout<<arr.back()<<"\t"<<arr[arr.size()-1]<<"\t"<<*(--it);return0;}
Bagus; Saya melihat Anda punya banyak keterampilan; dan ... pendekatan hebat. Saya pikir saya harus menulis lebih banyak jawaban untuk pertanyaan-pertanyaan terkenal seperti itu juga ;-)
GhostCat
5
Ini adalah pertanyaan yang cukup lama dan legendaris dan sudah ada banyak jawaban luar biasa di sana. Tetapi seiring waktu ada fungsi baru yang ditambahkan ke bahasa, jadi kita harus terus memperbarui hal sesuai fitur baru yang tersedia.
Saya hanya memperhatikan ada yang belum menyebutkan tentang C ++ 20. Maka terpikir untuk menulis jawaban.
C ++ 20
Di C ++ 20, ada cara baru yang lebih baik ditambahkan ke perpustakaan standar untuk menemukan panjang array yaitu std:ssize(). Fungsi ini mengembalikan a signed value.
Hanya FYI, jika Anda bertanya-tanya mengapa pendekatan ini tidak berfungsi ketika array diteruskan ke fungsi lain . Alasannya adalah,
Array tidak diteruskan oleh nilai dalam C ++, sebaliknya pointer ke array dilewatkan. Seperti dalam beberapa kasus melewati seluruh array bisa jadi operasi yang mahal. Anda dapat menguji ini dengan meneruskan array ke beberapa fungsi dan membuat beberapa perubahan pada array di sana dan kemudian mencetak array di main lagi. Anda akan mendapatkan hasil yang diperbarui.
Dan seperti yang sudah Anda ketahui, sizeof()fungsi ini memberikan jumlah byte, jadi pada fungsi lain itu akan mengembalikan jumlah byte yang dialokasikan untuk pointer daripada seluruh array. Jadi pendekatan ini tidak berhasil.
Tetapi saya yakin Anda dapat menemukan cara yang baik untuk melakukan ini, sesuai kebutuhan Anda.
ARRAYSIZE (arr) bekerja dengan memeriksa sizeof (arr) (# byte dalam array) dan sizeof (* (arr)) (# byte dalam satu elemen array). Jika yang pertama dapat dibagi oleh yang terakhir, mungkin arr memang array, dalam hal ini hasil pembagian adalah # elemen dalam array. Kalau tidak, arr tidak mungkin berupa array, dan kami menghasilkan kesalahan kompiler untuk mencegah kode dari kompilasi.
Karena ukuran bool adalah implementasi yang ditentukan, kita perlu membuang! (Sizeof (a) & sizeof (* (a))) ke size_t untuk memastikan hasil akhir memiliki tipe size_t.
Makro ini tidak sempurna karena salah menerima pointer tertentu, yaitu di mana ukuran pointer dibagi dengan ukuran pointee. Karena semua kode kita harus melalui compiler 32-bit, di mana pointer adalah 4 byte, ini berarti semua pointer ke tipe yang ukurannya 3 atau lebih besar dari 4 akan (dengan benar) ditolak.
dengan array integer seperti ini: int nombres[5] = { 9, 3 };fungsi ini mengembalikan 5bukan 2.
Anwar
GOOGLE_ARRAYSIZE(new int8_t)kembali 8pada pengujian saya env, bukannya meningkatkan kesalahan. Bagian yang dicor tampaknya berlebihan, belum lagi berteriak makro C. sizeof(a) / sizeof(*a)bekerja cukup sebagai solusi warisan.
3
Untuk C ++ / CX (saat menulis misalnya aplikasi UWP menggunakan C ++ di Visual Studio) kita dapat menemukan jumlah nilai dalam array dengan hanya menggunakan size()fungsi.
Meskipun potongan kode ini dapat menyelesaikan masalah, itu tidak menjelaskan mengapa atau bagaimana ia menjawab pertanyaan. Harap sertakan penjelasan untuk kode Anda, karena itu sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda
Balagurunathan Marimuthu
3
JAWABAN :
int number_of_elements =sizeof(array)/sizeof(array[0])
PENJELASAN :
Karena kompiler menetapkan potongan ukuran memori tertentu untuk setiap jenis data, dan sebuah array hanyalah sekelompok dari itu, Anda cukup membagi ukuran array dengan ukuran tipe data. Jika saya memiliki array 30 string, sistem saya menyisihkan 24 byte untuk setiap elemen (string) dari array. Pada 30 elemen, itu total 720 byte. 720/24 == 30 elemen. Algoritma kecil dan ketat untuk itu adalah:
int number_of_elements = sizeof(array)/sizeof(array[0]) yang setara dengan
number_of_elements = 720/24
Perhatikan bahwa Anda tidak perlu tahu tipe data array tersebut, meskipun itu tipe data khusus.
Tidak perlu untuk pendekatan kuno dan rawan kesalahan ini pada tahun 2019. stackoverflow.com/a/59109106/560648 Juga hanya dupe dari jawaban yang ada.
Lightness Races in Orbit
Namun demikian, platform ini sederhana, fasih, cepat, permintaan rendah, mandiri dan menghilangkan kebutuhan untuk memasukkan vektor atau pointer. Sejauh membodohi jawaban lain, tampaknya hanya ada satu jawaban lain dengan algoritma yang sama, dan yang satu tidak memberikan penjelasan tentang mekanisme yang mendasari masalah seperti jawaban saya. Saya dengan hormat menyarankan bahwa, alih-alih rawan kesalahan, ini cukup kuat.
Bob Warner
1
Hanya pemikiran, tetapi hanya memutuskan untuk membuat variabel penghitung dan menyimpan ukuran array di posisi [0]. Saya menghapus sebagian besar kode yang saya miliki di fungsi tetapi Anda akan melihat setelah keluar dari loop, prime [0] diberi nilai akhir 'a'. Saya mencoba menggunakan vektor tetapi VS Express 2013 tidak terlalu menyukainya. Perhatikan juga bahwa 'a' dimulai pada satu untuk menghindari penulisan ulang [0] dan ini diinisialisasi pada awal untuk menghindari kesalahan. Saya bukan ahli, hanya berpikir saya akan berbagi.
int prime[]={0};int primes(int x,int y){usingnamespace std;int a =1;for(int i = x; i <= y; i++){prime[a]= i; a++;}
prime[0]= a;return0;}
@bobbogo Bekerja dengan inline atau constexpr, mungkin Anda memiliki inline off atau opsional? ideone.com/VxogJ4
QuentinUK
@ Quentuk constexpradalah perbaikannya. inlinetidak. constexprcukup modern sekalipun. Apakah Anda yakin program pengujian Anda tidak menggunakan fitur modern lain, di mana Anda dapat mendeklarasikan array lokal yang panjangnya diberikan oleh variabel? Cobalah dengan dua array global.
Itu hanya berfungsi ketika arrjenis yang kompatibel dengan intdan array tidak lebih dari nilai maksimum jenis. Misalnya string Pascal sebenarnya adalah byte array menggunakan trik ini; panjang string maksimum dalam Pascal adalah 255 karakter.
Palec
Saya kira orang bisa memesan mengatakan 8 byte pada awal setiap array dan menggunakan tanda unsigned lama jika mereka ingin menyimpan objek. Saya pikir vektor mungkin lebih mudah. Tapi jelas solusi yang bagus untuk embedded system.
aj.toulan
1
Anda dapat menemukan panjang Array dengan mengikuti:
int arr[]={1,2,3,4,5,6};int size =*(&arr +1)- arr;
cout <<"Number of elements in arr[] is "<< size;return0;
Saya pribadi menyarankan (jika Anda tidak dapat bekerja dengan fungsi khusus untuk alasan apa pun) untuk pertama-tama memperluas kompatibilitas tipe array melewati apa yang biasanya Anda gunakan sebagai (jika Anda menyimpan nilai ≥ 0:
unsignedint x[]->int x[]
daripada Anda akan membuat elemen array 1 lebih besar dari yang Anda butuhkan untuk membuatnya. Untuk elemen terakhir Anda akan meletakkan beberapa tipe yang termasuk dalam specifier tipe diperluas tetapi Anda biasanya tidak menggunakan misalnya menggunakan contoh sebelumnya elemen terakhir adalah -1. Ini memungkinkan Anda (dengan menggunakan for for loop) untuk menemukan elemen terakhir dari sebuah array.
Salah satu alasan paling umum Anda akhirnya mencari ini adalah karena Anda ingin meneruskan array ke suatu fungsi, dan tidak harus melewati argumen lain untuk ukurannya. Anda juga umumnya ingin ukuran array menjadi dinamis. Array itu mungkin berisi objek, bukan primitif, dan objek mungkin rumit sehingga size_of () adalah opsi yang tidak aman untuk menghitung hitungan.
Seperti yang disarankan orang lain, pertimbangkan untuk menggunakan std :: vector atau list, dll sebagai ganti dari array primitif. Pada kompiler lama, bagaimanapun, Anda masih tidak akan memiliki solusi akhir yang mungkin Anda inginkan hanya dengan melakukan itu, karena mengisi wadah membutuhkan banyak baris push_back () jelek. Jika Anda seperti saya, ingin solusi garis tunggal dengan objek anonim terlibat.
Jawaban:
Jika maksud Anda adalah array gaya-C, maka Anda dapat melakukan sesuatu seperti:
Ini tidak berfungsi pada pointer (artinya tidak akan berfungsi untuk salah satu dari berikut ini):
atau:
Di C ++, jika Anda menginginkan perilaku seperti ini, maka Anda harus menggunakan kelas kontainer; mungkin
std::vector
.sumber
Seperti yang dikatakan orang lain, Anda dapat menggunakan
sizeof(arr)/sizeof(*arr)
tetapi ini akan memberi Anda jawaban yang salah untuk tipe pointer yang bukan array.Ini memiliki properti bagus gagal dikompilasi untuk jenis non array (visual studio memiliki
_countof
yang melakukan ini). Ituconstexpr
membuat ini ekspresi waktu kompilasi sehingga tidak memiliki kelemahan atas makro (setidaknya tidak saya tahu).Anda juga dapat mempertimbangkan menggunakan
std::array
dari C ++ 11 yang memaparkan panjangnya tanpa overhead di atas array C asli.C ++ 17 memiliki
std::size()
di<iterator>
header yang melakukan hal yang sama dan berfungsi untuk wadah STL juga (terima kasih kepada @Jon C ).sumber
T(arg&)[N]
.extent
, melihat itu sekarang ada dua karakteristik dengan itu yang membuatnya kurang berguna daripada fungsi di atas (untuk usecase ini). (1) Mengembalikan nol untuk pointer (bukan kesalahan kompilasi). (2) Membutuhkan parameter tipe sehingga untuk memeriksa variabel yang harus Anda lakukandecltype
Melakukan
sizeof( myArray )
akan memberi Anda jumlah total byte yang dialokasikan untuk array itu. Anda kemudian bisa mengetahui jumlah elemen dalam array dengan membaginya dengan ukuran satu elemen dalam array:sizeof( myArray[0] )
sumber
Meskipun ini adalah pertanyaan lama, ada baiknya memperbarui jawaban untuk C ++ 17. Di perpustakaan standar sekarang ada fungsi templated
std::size()
, yang mengembalikan jumlah elemen dalam wadah std atau array gaya-C. Sebagai contoh:sumber
Iya!
Mencoba
sizeof(array)/sizeof(array[0])
Saya tidak melihat cara apa pun untuk ini kecuali array Anda adalah array karakter (yaitu string).
PS: Dalam C ++ selalu gunakan
std::vector
. Ada beberapa fungsi bawaan dan fungsionalitas yang diperluas.sumber
std::vector
memiliki metodesize()
yang mengembalikan jumlah elemen dalam vektor.(Ya, ini adalah jawaban dari mulut ke mulut)
sumber
sumber
Sejak C ++ 11, beberapa template baru diperkenalkan untuk membantu mengurangi rasa sakit ketika berhadapan dengan panjang array. Semuanya didefinisikan dalam tajuk
<type_traits>
.std::rank<T>::value
Jika
T
merupakan tipe array, berikan nilai konstanta anggota sama dengan jumlah dimensi array. Untuk jenis lainnya, nilainya 0.std::extent<T, N>::value
Jika
T
merupakan tipe array, berikan nilai konstanta anggota sama dengan jumlah elemen di sepanjangN
dimensi th array, jikaN
dalam [0,std::rank<T>::value
). Untuk jenis lain, atau jikaT
array yang tidak diketahui terikat sepanjang dimensi pertama danN
0, nilainya 0.std::remove_extent<T>::type
Jika
T
adalah array dari beberapa tipeX
, berikan tipe typedef anggota sama denganX
, jika tidak tipe adalahT
. Perhatikan bahwa jikaT
array multidimensi, hanya dimensi pertama yang dihapus.std::remove_all_extents<T>::type
Jika
T
array multidimensi dari beberapa tipeX
, berikan tipe typedef anggota sama denganX
, jika tidak tipe adalahT
.Untuk mendapatkan panjang pada dimensi array multidimensi apa pun,
decltype
dapat digunakan untuk digabungkanstd::extent
. Sebagai contoh:BTY, untuk mendapatkan jumlah total elemen dalam array multidimensi:
Atau letakkan di templat fungsi:
Lebih banyak contoh cara menggunakannya dapat ditemukan dengan mengikuti tautan.
sumber
Ada juga cara TR1 / C ++ 11 / C ++ 17 (lihat Live on Coliru):
sumber
Alih-alih menggunakan fungsi array bawaan alias:
Anda harus menggunakan kelas array dan template array. Mencoba:
Jadi sekarang jika Anda ingin menemukan panjang array, yang harus Anda lakukan adalah menggunakan fungsi ukuran di kelas array.
dan itu harus mengembalikan panjang elemen dalam array.
sumber
Di C ++, menggunakan kelas std :: array untuk mendeklarasikan sebuah array, orang dapat dengan mudah menemukan ukuran array dan juga elemen terakhir.
Faktanya, kelas array memiliki banyak fungsi lain yang memungkinkan kita menggunakan array sebagai wadah standar.
Referensi 1 ke C ++ std :: kelas array
Referensi 2 ke std :: kelas array
Contoh dalam referensi sangat membantu.
sumber
Ini adalah pertanyaan yang cukup lama dan legendaris dan sudah ada banyak jawaban luar biasa di sana. Tetapi seiring waktu ada fungsi baru yang ditambahkan ke bahasa, jadi kita harus terus memperbarui hal sesuai fitur baru yang tersedia.
Saya hanya memperhatikan ada yang belum menyebutkan tentang C ++ 20. Maka terpikir untuk menulis jawaban.
C ++ 20
Di C ++ 20, ada cara baru yang lebih baik ditambahkan ke perpustakaan standar untuk menemukan panjang array yaitu
std:ssize()
. Fungsi ini mengembalikan asigned value
.C ++ 17
Di C ++ 17 ada cara yang lebih baik (pada waktu itu) untuk hal yang sama yang
std::size()
didefinisikan dalamiterator
.PS Metode ini berfungsi untuk
vector
.Tua
Pendekatan tradisional ini sudah disebutkan dalam banyak jawaban lain.
Hanya FYI, jika Anda bertanya-tanya mengapa pendekatan ini tidak berfungsi ketika array diteruskan ke fungsi lain . Alasannya adalah,
Array tidak diteruskan oleh nilai dalam C ++, sebaliknya pointer ke array dilewatkan. Seperti dalam beberapa kasus melewati seluruh array bisa jadi operasi yang mahal. Anda dapat menguji ini dengan meneruskan array ke beberapa fungsi dan membuat beberapa perubahan pada array di sana dan kemudian mencetak array di main lagi. Anda akan mendapatkan hasil yang diperbarui.
Dan seperti yang sudah Anda ketahui,
sizeof()
fungsi ini memberikan jumlah byte, jadi pada fungsi lain itu akan mengembalikan jumlah byte yang dialokasikan untuk pointer daripada seluruh array. Jadi pendekatan ini tidak berhasil.Tetapi saya yakin Anda dapat menemukan cara yang baik untuk melakukan ini, sesuai kebutuhan Anda.
Selamat Coding.
sumber
Anda memiliki banyak opsi untuk digunakan untuk mendapatkan ukuran array C.
int myArray [] = {0, 1, 2, 3, 4, 5, 7};
1) sizeof(<array>) / sizeof(<type>):
2) sizeof(<array>) / sizeof(*<array>):
3) sizeof(<array>) / sizeof(<array>[<element>]):
sumber
Ini adalah salah satu implementasi
ArraySize
dari Google Protobuf .sumber
int nombres[5] = { 9, 3 };
fungsi ini mengembalikan5
bukan2
.GOOGLE_ARRAYSIZE(new int8_t)
kembali8
pada pengujian saya env, bukannya meningkatkan kesalahan. Bagian yang dicor tampaknya berlebihan, belum lagi berteriak makro C.sizeof(a) / sizeof(*a)
bekerja cukup sebagai solusi warisan.Untuk C ++ / CX (saat menulis misalnya aplikasi UWP menggunakan C ++ di Visual Studio) kita dapat menemukan jumlah nilai dalam array dengan hanya menggunakan
size()
fungsi.Kode sumber:
Jika Anda
cout
yangsize_of_array
output akan:sumber
sizeof(array_name)
memberikan ukuran seluruh array dansizeof(int)
memberikan ukuran tipe data dari setiap elemen array.Jadi, membagi ukuran seluruh array dengan ukuran elemen tunggal array memberikan panjang array.
sumber
JAWABAN :
PENJELASAN :
Karena kompiler menetapkan potongan ukuran memori tertentu untuk setiap jenis data, dan sebuah array hanyalah sekelompok dari itu, Anda cukup membagi ukuran array dengan ukuran tipe data. Jika saya memiliki array 30 string, sistem saya menyisihkan 24 byte untuk setiap elemen (string) dari array. Pada 30 elemen, itu total 720 byte. 720/24 == 30 elemen. Algoritma kecil dan ketat untuk itu adalah:
int number_of_elements = sizeof(array)/sizeof(array[0])
yang setara dengannumber_of_elements = 720/24
Perhatikan bahwa Anda tidak perlu tahu tipe data array tersebut, meskipun itu tipe data khusus.
sumber
Hanya pemikiran, tetapi hanya memutuskan untuk membuat variabel penghitung dan menyimpan ukuran array di posisi [0]. Saya menghapus sebagian besar kode yang saya miliki di fungsi tetapi Anda akan melihat setelah keluar dari loop, prime [0] diberi nilai akhir 'a'. Saya mencoba menggunakan vektor tetapi VS Express 2013 tidak terlalu menyukainya. Perhatikan juga bahwa 'a' dimulai pada satu untuk menghindari penulisan ulang [0] dan ini diinisialisasi pada awal untuk menghindari kesalahan. Saya bukan ahli, hanya berpikir saya akan berbagi.
sumber
Solusi bagus yang menggunakan obat generik:
Kemudian cukup panggil
arraysize(_Array);
untuk mendapatkan panjang array.Sumber
sumber
constexpr
adalah perbaikannya.inline
tidak.constexpr
cukup modern sekalipun. Apakah Anda yakin program pengujian Anda tidak menggunakan fitur modern lain, di mana Anda dapat mendeklarasikan array lokal yang panjangnya diberikan oleh variabel? Cobalah dengan dua array global.Untuk kompiler g ++ lama, Anda bisa melakukan ini
sumber
Saya memberikan solusi rumit di sini:
Anda selalu dapat menyimpan
length
di elemen pertama:Biaya yang harus Anda
--arr
bayar ketika memohonfree
sumber
arr
jenis yang kompatibel denganint
dan array tidak lebih dari nilai maksimum jenis. Misalnya string Pascal sebenarnya adalah byte array menggunakan trik ini; panjang string maksimum dalam Pascal adalah 255 karakter.Anda dapat menemukan panjang Array dengan mengikuti:
sumber
Cukup Anda dapat menggunakan potongan ini:
dan inilah rujukannya: http://www.cplusplus.com/reference/array/array/size/
sumber
Hindari menggunakan tipe bersamaan dengan sizeof, seperti
sizeof(array)/sizeof(char)
, tiba-tiba menjadi rusak jika Anda mengubah jenis array.Di studio visual, Anda memiliki keseimbangan jika
sizeof(array)/sizeof(*array)
. Anda cukup mengetik_countof(array)
sumber
Saya pribadi menyarankan (jika Anda tidak dapat bekerja dengan fungsi khusus untuk alasan apa pun) untuk pertama-tama memperluas kompatibilitas tipe array melewati apa yang biasanya Anda gunakan sebagai (jika Anda menyimpan nilai ≥ 0:
daripada Anda akan membuat elemen array 1 lebih besar dari yang Anda butuhkan untuk membuatnya. Untuk elemen terakhir Anda akan meletakkan beberapa tipe yang termasuk dalam specifier tipe diperluas tetapi Anda biasanya tidak menggunakan misalnya menggunakan contoh sebelumnya elemen terakhir adalah -1. Ini memungkinkan Anda (dengan menggunakan for for loop) untuk menemukan elemen terakhir dari sebuah array.
sumber
Salah satu alasan paling umum Anda akhirnya mencari ini adalah karena Anda ingin meneruskan array ke suatu fungsi, dan tidak harus melewati argumen lain untuk ukurannya. Anda juga umumnya ingin ukuran array menjadi dinamis. Array itu mungkin berisi objek, bukan primitif, dan objek mungkin rumit sehingga size_of () adalah opsi yang tidak aman untuk menghitung hitungan.
Seperti yang disarankan orang lain, pertimbangkan untuk menggunakan std :: vector atau list, dll sebagai ganti dari array primitif. Pada kompiler lama, bagaimanapun, Anda masih tidak akan memiliki solusi akhir yang mungkin Anda inginkan hanya dengan melakukan itu, karena mengisi wadah membutuhkan banyak baris push_back () jelek. Jika Anda seperti saya, ingin solusi garis tunggal dengan objek anonim terlibat.
Jika Anda menggunakan alternatif wadah STL ke array primitif, pos SO ini mungkin berguna bagi Anda untuk cara menginisialisasi: Apa cara termudah untuk menginisialisasi std :: vektor dengan elemen hardcoded?
Berikut adalah metode yang saya gunakan untuk ini yang akan bekerja secara universal di seluruh kompiler dan platform:
Buat struct atau kelas sebagai wadah untuk koleksi objek Anda. Tetapkan fungsi kelebihan operator untuk <<.
Anda dapat membuat fungsi yang menggunakan struct Anda sebagai parameter, misalnya:
Kemudian, Anda dapat memanggil fungsi itu, seperti ini:
Dengan begitu, Anda dapat membangun dan meneruskan koleksi objek berukuran dinamis ke fungsi dalam satu baris bersih!
sumber
Katakanlah Anda memiliki array global yang dideklarasikan di bagian atas halaman
Untuk mengetahui berapa banyak elemen yang ada (dalam c ++) dalam array ketik kode berikut:
Sizeof (NAME_OF_ARRAY) / 4 akan memberi Anda jumlah elemen untuk nama array yang diberikan.
sumber