क्या यह पता लगाने का एक तरीका है कि किसी सरणी में कितने मान हैं? यह पता लगाना कि मैं किसी सरणी के अंत तक पहुँचा हूँ या नहीं, यह भी काम करेगा।
क्या यह पता लगाने का एक तरीका है कि किसी सरणी में कितने मान हैं? यह पता लगाना कि मैं किसी सरणी के अंत तक पहुँचा हूँ या नहीं, यह भी काम करेगा।
जवाबों:
यदि आपका मतलब सी-स्टाइल ऐरे से है, तो आप कुछ ऐसा कर सकते हैं:
int a[7];
std::cout << "Length of array = " << (sizeof(a)/sizeof(*a)) << std::endl;
यह संकेत पर काम नहीं करता है (यानी यह निम्नलिखित में से किसी के लिए भी काम नहीं करेगा ):
int *p = new int[7];
std::cout << "Length of array = " << (sizeof(p)/sizeof(*p)) << std::endl;
या:
void func(int *p)
{
std::cout << "Length of array = " << (sizeof(p)/sizeof(*p)) << std::endl;
}
int a[7];
func(a);
सी ++ में, यदि आप इस तरह का व्यवहार चाहते हैं, तो आपको कंटेनर क्लास का उपयोग करना चाहिए; शायद std::vector
।
जैसा कि अन्य ने कहा है कि आप इसका उपयोग कर सकते हैं sizeof(arr)/sizeof(*arr)
लेकिन यह आपको सूचक प्रकारों के लिए गलत उत्तर देगा जो कि सरणियाँ नहीं हैं।
template<class T, size_t N>
constexpr size_t size(T (&)[N]) { return N; }
यह गैर सरणी प्रकार (दृश्य स्टूडियो के लिए संकलन करने में विफल होने की अच्छी संपत्ति है) _countof
ऐसा होता है)। constexpr
तो यह मैक्रो पर कोई कमियां नहीं है (कम से कम कोई भी मैं के बारे में पता) यह एक संकलन समय अभिव्यक्ति बना देता है।
आप std::array
C ++ 11 का उपयोग करने पर भी विचार कर सकते हैं जो अपनी लंबाई को एक देशी C सरणी पर ओवरहेड के साथ उजागर करता है।
सी ++ 17 है std::size()
में <iterator>
शीर्ष लेख है जो एक ही करता है और एसटीएल कंटेनर भी (करने के लिए धन्यवाद के लिए काम करता @Jon सी )।
T(arg&)[N]
।
extent
, अब इसे देखते हुए इसके साथ दो विशेषताएँ हैं जो इसे ऊपर दिए गए फ़ंक्शन (इस usecase के लिए) की तुलना में कम उपयोगी बनाती हैं। (1) यह पॉइंटर्स के लिए शून्य देता है (संकलन त्रुटि के बजाय)। (२) इसके लिए एक प्रकार के पैरामीटर की आवश्यकता होती है ताकि एक चर की जाँच करने के लिए आपको करना होगाdecltype
करने sizeof( myArray )
से आपको उस सरणी के लिए आवंटित बाइट्स की कुल संख्या मिल जाएगी। तब आप सरणी में एक तत्व के आकार से विभाजित करके सरणी में तत्वों की संख्या का पता लगा सकते हैं:sizeof( myArray[0] )
हालांकि यह एक पुराना सवाल है, यह C ++ 17 के जवाब को अपडेट करने लायक है। मानक पुस्तकालय में अब टेम्पर्ड फंक्शन है std::size()
, जो एक std कंटेनर या C- स्टाइल एरे दोनों में तत्वों की संख्या लौटाता है। उदाहरण के लिए:
#include <iterator>
uint32_t data[] = {10, 20, 30, 40};
auto dataSize = std::size(data);
// dataSize == 4
क्या यह पता लगाने का एक तरीका है कि किसी सरणी में कितने मान हैं?
हाँ!
प्रयत्न sizeof(array)/sizeof(array[0])
यह पता लगाना कि मैं किसी सरणी के अंत तक पहुँचा हूँ या नहीं, यह भी काम करेगा।
मुझे इसके लिए कोई रास्ता नहीं दिख रहा है जब तक कि आपका सरणी वर्णों का एक सरणी (यानी स्ट्रिंग) नहीं है।
PS: C ++ में हमेशा उपयोग करते हैं std::vector
। कई इनबिल्ट फ़ंक्शंस और एक विस्तारित कार्यक्षमता है।
std::vector
एक विधि है size()
जो वेक्टर में तत्वों की संख्या लौटाती है।
(हां, यह जुबान-इन-गाल जवाब है)
#include <iostream>
int main ()
{
using namespace std;
int arr[] = {2, 7, 1, 111};
auto array_length = end(arr) - begin(arr);
cout << "Length of array: " << array_length << endl;
}
सी ++ 11 के बाद से, सरणी की लंबाई के साथ काम करते समय दर्द को कम करने में मदद करने के लिए कुछ नए टेम्पलेट पेश किए जाते हैं। उन सभी को हेडर में परिभाषित किया गया है <type_traits>
।
यदि T
एक सरणी प्रकार है, तो सदस्य को सरणी के आयामों की संख्या के बराबर निरंतर मूल्य प्रदान करता है। किसी अन्य प्रकार के लिए, मान 0 है।
यदि T
एक सरणी प्रकार है, तो सदस्य N
को सरणी के वें आयाम के साथ तत्वों की संख्या के बराबर निरंतर मान प्रदान करता है , यदि N
यह [0, में है std::rank<T>::value
)। किसी भी अन्य प्रकार के लिए, या यदि T
इसका पहला आयाम अज्ञात अज्ञात है और N
0 है, तो मान 0 है।
यदि T
किसी प्रकार का एक सरणी है X
, तो सदस्य को टाइप के रूप में टाइपफ़ीड प्रदान करता है X
, अन्यथा प्रकार है T
। ध्यान दें कि यदि T
एक बहुआयामी सरणी है, तो केवल पहला आयाम हटा दिया जाता है।
std::remove_all_extents<T>::type
यदि T
किसी प्रकार का एक बहुआयामी सरणी है X
, तो सदस्य को टाइप के समान टाइपफ़ीड प्रदान करता है X
, अन्यथा प्रकार है T
।
एक बहुआयामी सरणी के किसी भी आयाम पर लंबाई प्राप्त करने के लिए, के decltype
साथ संयोजन के लिए इस्तेमाल किया जा सकता है std::extent
। उदाहरण के लिए:
#include <iostream>
#include <type_traits> // std::remove_extent std::remove_all_extents std::rank std::extent
template<class T, size_t N>
constexpr size_t length(T(&)[N]) { return N; }
template<class T, size_t N>
constexpr size_t length2(T(&arr)[N]) { return sizeof(arr) / sizeof(*arr); }
int main()
{
int a[5][4][3]{{{1,2,3}, {4,5,6}}, { }, {{7,8,9}}};
// New way
constexpr auto l1 = std::extent<decltype(a)>::value; // 5
constexpr auto l2 = std::extent<decltype(a), 1>::value; // 4
constexpr auto l3 = std::extent<decltype(a), 2>::value; // 3
constexpr auto l4 = std::extent<decltype(a), 3>::value; // 0
// Mixed way
constexpr auto la = length(a);
//constexpr auto lpa = length(*a); // compile error
//auto lpa = length(*a); // get at runtime
std::remove_extent<decltype(a)>::type pa; // get at compile time
//std::remove_reference<decltype(*a)>::type pa; // same as above
constexpr auto lpa = length(pa);
std::cout << la << ' ' << lpa << '\n';
// Old way
constexpr auto la2 = sizeof(a) / sizeof(*a);
constexpr auto lpa2 = sizeof(*a) / sizeof(**a);
std::cout << la2 << ' ' << lpa2 << '\n';
return 0;
}
एक बहु-विषयक सरणी में तत्वों की कुल संख्या प्राप्त करने के लिए BTY:
constexpr auto l = sizeof(a) / sizeof(std::remove_all_extents<decltype(a)>::type);
या इसे फंक्शन टेम्पलेट में रखें:
#include <iostream>
#include <type_traits>
template<class T>
constexpr size_t len(T &a)
{
return sizeof(a) / sizeof(typename std::remove_all_extents<T>::type);
}
int main()
{
int a[5][4][3]{{{1,2,3}, {4,5,6}}, { }, {{7,8,9}}};
constexpr auto ttt = len(a);
int i;
std::cout << ttt << ' ' << len(i) << '\n';
return 0;
}
लिंक का पालन करके उन्हें कैसे उपयोग किया जा सकता है, इसके अधिक उदाहरण।
TR1 / C ++ 11 / C ++ 17 तरीका भी है (इसे देखें Live on Coliru):
const std::string s[3] = { "1"s, "2"s, "3"s };
constexpr auto n = std::extent< decltype(s) >::value; // From <type_traits>
constexpr auto n2 = std::extent_v< decltype(s) >; // C++17 shorthand
const auto a = std::array{ "1"s, "2"s, "3"s }; // C++17 class template arg deduction -- http://en.cppreference.com/w/cpp/language/class_template_argument_deduction
constexpr auto size = std::tuple_size_v< decltype(a) >;
std::cout << n << " " << n2 << " " << size << "\n"; // Prints 3 3 3
बिल्ट इन सरणी फंक्शन उर्फ का उपयोग करने के बजाय:
int x[3] = {0, 1, 2};
आपको एरे क्लास और एरे टेम्पलेट का उपयोग करना चाहिए। प्रयत्न:
#include <array>
array<type_of_the_array, number_of_elements_in_the_array> Name_of_Array = {};
तो अब अगर आप सरणी की लंबाई का पता लगाना चाहते हैं, तो आपको केवल कक्षा में आकार फ़ंक्शन का उपयोग करना होगा।
Name_of_Array.size();
और उस सरणी में तत्वों की लंबाई को वापस करना चाहिए।
C ++ में, एक सरणी घोषित करने के लिए std :: array class का उपयोग करके, कोई आसानी से एक सरणी का आकार और अंतिम तत्व भी पा सकता है।
#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 element
auto it=arr.end();
std::cout<<arr.back()<<"\t"<<arr[arr.size()-1]<<"\t"<<*(--it);
return 0;
}
वास्तव में, सरणी वर्ग में कई अन्य कार्य हैं जो हमें एक मानक कंटेनर का उपयोग करते हैं।
संदर्भ 1 से C ++ std :: सरणी वर्ग
संदर्भ 2 से std :: सरणी वर्ग
संदर्भ में उदाहरण सहायक हैं।
यह बहुत पुराना और पौराणिक सवाल है और वहाँ पहले से ही कई अद्भुत जवाब हैं। लेकिन समय के साथ भाषाओं में नई कार्यक्षमताएँ जुड़ती जा रही हैं, इसलिए हमें उपलब्ध नई सुविधाओं के अनुसार चीजों को अपडेट करते रहना चाहिए।
मैंने अभी तक C ++ 20 के बारे में कोई भी उल्लेख नहीं किया है। तो जवाब लिखने की सोची।
C ++ 20 में, सरणी की लंबाई अर्थात की खोज के लिए मानक पुस्तकालय में एक नया बेहतर तरीका जोड़ा गया है std:ssize()
। यह फ़ंक्शन देता है a signed value
।
#include <iostream>
int main() {
int arr[] = {1, 2, 3};
std::cout << std::ssize(arr);
return 0;
}
C ++ 17 में उसी के लिए एक बेहतर तरीका (उस समय) था जिसे std::size()
परिभाषित किया गया है iterator
।
#include <iostream>
#include <iterator> // required for std::size
int main(){
int arr[] = {1, 2, 3};
std::cout << "Size is " << std::size(arr);
return 0;
}
पुनश्च यह विधि भी काम करती है vector
।
यह पारंपरिक दृष्टिकोण पहले से ही कई अन्य उत्तरों में उल्लिखित है।
#include <iostream>
int main() {
int array[] = { 1, 2, 3 };
std::cout << sizeof(array) / sizeof(array[0]);
return 0;
}
सिर्फ FYI करें, अगर आपको आश्चर्य हो कि जब यह सरणी किसी अन्य फ़ंक्शन के लिए पास हो जाती है तो यह दृष्टिकोण काम क्यों नहीं करता है । कारण यह है की,
C ++ में किसी मान को अरैस्ट नहीं किया जाता है, इसके बजाय पॉइंटर टू ऐरे पास किया जाता है। जैसा कि कुछ मामलों में पूरे सरणियों को पारित करना महंगा ऑपरेशन हो सकता है। आप सरणी को किसी फ़ंक्शन में पास करके इसका परीक्षण कर सकते हैं और वहां सरणी में कुछ बदलाव कर सकते हैं और फिर सरणी को मुख्य रूप से प्रिंट कर सकते हैं। आपको अद्यतन परिणाम मिलेंगे।
और जैसा कि आप पहले से ही जानते हैं, sizeof()
फ़ंक्शन बाइट्स की संख्या देता है, इसलिए अन्य फ़ंक्शन में यह सूचक के लिए आवंटित बाइट्स की संख्या को पूरे सरणी के बजाय वापस कर देगा। तो यह दृष्टिकोण काम नहीं करता है।
लेकिन मुझे यकीन है कि आप अपनी आवश्यकता के अनुसार ऐसा करने का एक अच्छा तरीका पा सकते हैं।
हैप्पी कोडिंग।
आपके पास C सरणी आकार प्राप्त करने के लिए उपयोग किए जाने वाले विकल्पों का एक गुच्छा है।
int myArray [] = {0, 1, 2, 3, 4, 5, 7};
1) sizeof(<array>) / sizeof(<type>):
std::cout << "Size:" << sizeof(myArray) / sizeof(int) << std::endl;
2) sizeof(<array>) / sizeof(*<array>):
std::cout << "Size:" << sizeof(myArray) / sizeof(*myArray) << std::endl;
3) sizeof(<array>) / sizeof(<array>[<element>]):
std::cout << "Size:" << sizeof(myArray) / sizeof(myArray[0]) << std::endl;
Google ProtobufArraySize
से एक कार्यान्वयन यहां दिया गया है ।
#define GOOGLE_ARRAYSIZE(a) \
((sizeof(a) / sizeof(*(a))) / static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
// test codes...
char* ptr[] = { "you", "are", "here" };
int testarr[] = {1, 2, 3, 4};
cout << GOOGLE_ARRAYSIZE(testarr) << endl;
cout << GOOGLE_ARRAYSIZE(ptr) << endl;
ARRAYSIZE (गिरफ्तार) साइज़ोफ़ (गिरफ्तारी) (सरणी में बाइट्स का #) और साइज़ोफ़ (* (गिरफ्तार)) (एक सरणी तत्व में बाइट्स का #) निरीक्षण करके काम करता है। यदि पूर्व को उत्तरार्द्ध द्वारा विभाज्य है, तो शायद गिरफ्तारी वास्तव में एक सरणी है, इस मामले में विभाजन परिणाम सरणी में तत्वों का # है। अन्यथा, गिरफ्तारी संभवतः एक सरणी नहीं हो सकती, और हम कोड को संकलित होने से रोकने के लिए एक संकलक त्रुटि उत्पन्न करते हैं।
चूँकि बूल का आकार कार्यान्वयन-परिभाषित है, इसलिए हमें अंतिम परिणाम प्रकार type_t है यह सुनिश्चित करने के लिए size_t को (sizeof) (a) और sizeof (* (a)) को कास्ट करना होगा।
यह मैक्रो सही नहीं है क्योंकि यह गलत तरीके से कुछ बिंदुओं को स्वीकार करता है, जहां पॉइंटर का आकार पॉइंटी आकार से विभाज्य है। चूंकि हमारे सभी कोड को 32-बिट कंपाइलर से गुजरना पड़ता है, जहां एक पॉइंटर 4 बाइट्स होता है, इसका मतलब है कि सभी पॉइंटर एक प्रकार के हैं जिनका आकार 3 या 4 से अधिक है (राइटली) अस्वीकार कर दिया जाएगा।
int nombres[5] = { 9, 3 };
इस समारोह के 5
बजाय लौटता है 2
।
C ++ / CX के लिए (जब Visual Studio में C ++ का उपयोग करके UWP एप्लिकेशन लिखते हैं) तो हम केवल size()
फ़ंक्शन का उपयोग करके किसी सरणी में मानों की संख्या पा सकते हैं ।
सोर्स कोड:
string myArray[] = { "Example1", "Example2", "Example3", "Example4" };
int size_of_array=size(myArray);
आप तो उत्पादन होगा:cout
size_of_array
>>> 4
sizeof(array_name)
पूरे सरणी sizeof(int)
का आकार देता है और हर प्रकार के तत्व के डेटा प्रकार का आकार देता है।
इसलिए सरणी के एकल तत्व के आकार से पूरे सरणी के आकार को विभाजित करना सरणी की लंबाई देता है ।
int array_name[] = {1, 2, 3, 4, 5, 6};
int length = sizeof(array_name)/sizeof(int);
उत्तर :
int number_of_elements = sizeof(array)/sizeof(array[0])
शोषण :
चूंकि कंपाइलर प्रत्येक प्रकार के डेटा के लिए मेमोरी का एक विशिष्ट आकार अलग-अलग सेट करता है, और एक सरणी केवल उन लोगों का एक समूह होता है, आप बस डेटा प्रकार के आकार द्वारा सरणी के आकार को विभाजित करते हैं। यदि मेरे पास 30 स्ट्रिंग्स हैं, तो मेरा सिस्टम ऐरे के प्रत्येक तत्व (स्ट्रिंग) के लिए 24 बाइट्स को अलग करता है। 30 तत्वों पर, यह कुल 720 बाइट्स है। 720/24 == 30 तत्व। उस के लिए छोटा, तंग एल्गोरिथ्म है:
int number_of_elements = sizeof(array)/sizeof(array[0])
जिसके बराबर है
number_of_elements = 720/24
ध्यान दें कि आपको यह जानने की आवश्यकता नहीं है कि सरणी डेटा किस प्रकार का है, भले ही वह कस्टम डेटा प्रकार हो।
बस एक विचार, लेकिन सिर्फ एक काउंटर वेरिएबल बनाने और स्थिति आकार को स्टोर करने का फैसला किया [0]। मैंने फ़ंक्शन में अधिकांश कोड हटा दिए थे, लेकिन आप लूप से बाहर निकलने के बाद देखेंगे, प्राइम [0] को 'a' का अंतिम मान दिया गया है। मैंने वैक्टर का उपयोग करने की कोशिश की लेकिन वीएस एक्सप्रेस 2013 को यह बहुत पसंद नहीं आया। यह भी नोट करें कि 'a' ओवरराइटिंग से बचने के लिए एक पर शुरू होता है [0] और त्रुटियों से बचने के लिए इसे शुरुआत में शुरू किया जाता है। मैं कोई विशेषज्ञ नहीं हूं, बस सोचा था कि मैं साझा करूंगा।
int prime[] = {0};
int primes(int x, int y){
using namespace std; int a = 1;
for (int i = x; i <= y; i++){prime[a] = i; a++; }
prime[0] = a; return 0;
}
एक अच्छा समाधान जो जेनरिक का उपयोग करता है:
template <typename T,unsigned S>
inline unsigned arraysize(const T (&v)[S]) { return S; }
फिर arraysize(_Array);
सरणी की लंबाई प्राप्त करने के लिए बस कॉल करें ।
constexpr
ठीक है। inline
नहीं है। constexpr
हालांकि बहुत आधुनिक है। क्या आप सुनिश्चित हैं कि आपका परीक्षण कार्यक्रम किसी अन्य आधुनिक सुविधा का उपयोग नहीं कर रहा है, जहां आप एक स्थानीय सरणी की घोषणा कर सकते हैं जिसकी लंबाई एक चर द्वारा दी गई है? इसे दो वैश्विक सरणियों के साथ आज़माएं।
पुराने g ++ कंपाइलर के लिए, आप ऐसा कर सकते हैं
template <class T, size_t N>
char (&helper(T (&)[N]))[N];
#define arraysize(array) (sizeof(helper(array)))
int main() {
int a[10];
std::cout << arraysize(a) << std::endl;
return 0;
}
मैं यहां एक मुश्किल समाधान प्रदान करता हूं:
आप हमेशा length
पहले तत्व में स्टोर कर सकते हैं :
// malloc/new
arr[0] = length;
arr++;
// do anything.
int len = *(arr-1);
free(--arr);
लागत है तो आपको --arr
जब आह्वानfree
arr
प्रकार एक प्रकार से संगत हो int
और सरणी प्रकार के अधिकतम मान से अधिक लंबा न हो। उदाहरण के पास्कल स्ट्रिंग्स वास्तव में इस ट्रिक का उपयोग करके बाइट ऐरे हैं; पास्कल में तार की अधिकतम लंबाई 255 वर्ण है।
आप निम्न द्वारा एक ऐरे की लंबाई पा सकते हैं:
int arr[] = {1, 2, 3, 4, 5, 6};
int size = *(&arr + 1) - arr;
cout << "Number of elements in arr[] is "<< size;
return 0;
बस आप इस स्निपेट का उपयोग कर सकते हैं:
#include <iostream>
#include <string>
#include <array>
using namespace std;
int main()
{
array<int,3> values;
cout << "No. elements in valuea array: " << values.size() << " elements." << endl;
cout << "sizeof(myints): " << sizeof(values) << endl;
}
और यहाँ संदर्भ है: http://www.cplusplus.com/reference/array/array/size/
साइज़ोफ़ के साथ टाइप के उपयोग से बचें, जैसा कि sizeof(array)/sizeof(char)
, यदि आप सरणी के प्रकार को बदलते हैं तो अचानक भ्रष्ट हो जाता है।
दृश्य स्टूडियो में, यदि आपके पास समतुल्य है sizeof(array)/sizeof(*array)
। आप बस टाइप कर सकते हैं_countof(array)
मैं व्यक्तिगत रूप से सुझाव दूंगा (यदि आप जो भी कारण के लिए विशेष कार्यों के साथ काम करने में असमर्थ हैं) सबसे पहले सरणियों के प्रकार की संगतता का विस्तार करें जो आप सामान्य रूप से इसका उपयोग करेंगे (यदि आप मूल्यों को संग्रहीत कर रहे थे ≥ 0:
unsigned int x[] -> int x[]
की तुलना में आप इसे बनाने के लिए जरूरत की तुलना में सरणी 1 तत्व को बड़ा करेंगे। अंतिम तत्व के लिए आप कुछ प्रकार डालेंगे जो कि विस्तारित प्रकार के विनिर्देशक में शामिल है, लेकिन यह कि आप सामान्य रूप से उपयोग नहीं करेंगे, पिछले उदाहरण का उपयोग करते हुए अंतिम तत्व -1 होगा। यह आपको एक सरणी के अंतिम तत्व को खोजने के लिए (लूप के लिए उपयोग करके) सक्षम करता है।
सबसे आम कारणों में से एक जिसे आप ढूंढ रहे हैं, वह यह है कि आप किसी फ़ंक्शन के लिए एक सरणी पास करना चाहते हैं, और इसके आकार के लिए कोई अन्य तर्क पास नहीं करना है। आप आम तौर पर सरणी आकार को डायनामिक होना भी पसंद करेंगे। उस सरणी में ऑब्जेक्ट्स हो सकते हैं, प्राइमेटीज़ नहीं हैं, और ऑब्जेक्ट शायद जटिल हो जैसे कि size_of () गिनती की गणना करने के लिए एक सुरक्षित विकल्प नहीं है।
जैसा कि दूसरों ने सुझाव दिया है, आदिम सरणी के बजाय एक std :: वेक्टर या सूची, आदि का उपयोग करने पर विचार करें। पुराने कंपाइलरों पर, हालांकि, आपके पास अभी भी अंतिम समाधान नहीं होगा, जिसे आप शायद बस इतना ही करना चाहते हैं, क्योंकि कंटेनर को आबाद करने के लिए बदसूरत push_back () लाइनों का एक गुच्छा आवश्यक है। यदि आप मेरी तरह हैं, तो अनाम वस्तुओं के साथ एकल पंक्ति समाधान चाहते हैं।
यदि आप एक आदिम सरणी के लिए एसटीएल कंटेनर के विकल्प के साथ जाते हैं, तो यह एसओ पद इसे आरंभ करने के तरीकों के लिए आपके लिए उपयोग हो सकता है: एसटीडी को आरंभीकृत करने का सबसे आसान तरीका क्या है : हार्डकोड तत्वों के साथ वेक्टर?
यहाँ एक विधि है जो मैं इसके लिए उपयोग कर रहा हूं जो संकलक और प्लेटफार्मों पर सार्वभौमिक रूप से काम करेगा:
अपने संग्रह के लिए कंटेनर के रूप में एक संरचना या वर्ग बनाएं। << के लिए एक ऑपरेटर अधिभार समारोह को परिभाषित करें।
class MyObject;
struct MyObjectList
{
std::list<MyObject> objects;
MyObjectList& operator<<( const MyObject o )
{
objects.push_back( o );
return *this;
}
};
आप ऐसे कार्य बना सकते हैं जो आपकी संरचना को एक पैरामीटर के रूप में लेते हैं, जैसे:
someFunc( MyObjectList &objects );
फिर, आप इस तरह से उस फ़ंक्शन को कॉल कर सकते हैं:
someFunc( MyObjectList() << MyObject(1) << MyObject(2) << MyObject(3) );
इस तरह, आप एक सिंगल क्लीन लाइन में फ़ंक्शन के लिए गतिशील रूप से आकार के संग्रह का निर्माण और पास कर सकते हैं!
कहते हैं कि आपके पास पृष्ठ के शीर्ष पर घोषित एक वैश्विक सरणी है
int global[] = { 1, 2, 3, 4 };
यह जानने के लिए कि सरणी में कितने तत्व हैं (c ++ में) निम्न कोड टाइप करें:
sizeof(global) / 4;
Sizeof (NAME_OF_ARRAY) / 4 आपको दिए गए सरणी नाम के लिए तत्वों की संख्या वापस देगा।