आप स्वचालित रूप से सरणी के आकार को 'सीख' सकते हैं:
template<typename T, size_t N>
void set_data(const T (&w)[N]){
w_.assign(w, w+N);
}
उम्मीद है, आप ऊपर के रूप में set_data के लिए इंटरफ़ेस बदल सकते हैं। यह अभी भी अपने पहले तर्क के रूप में एक सी-शैली सरणी को स्वीकार करता है। यह सिर्फ संदर्भ से लेना होता है।
यह काम किस प्रकार करता है
[अद्यतन: आकार सीखने पर अधिक व्यापक चर्चा के लिए यहां देखें ]
यहाँ एक अधिक सामान्य समाधान है:
template<typename T, size_t N>
void copy_from_array(vector<T> &target_vector, const T (&source_array)[N]) {
target_vector.assign(source_array, source_array+N);
}
यह काम करता है क्योंकि सरणी को संदर्भ-दर-सरणी के रूप में पारित किया जा रहा है। C / C ++ में, आप एक एरे को फंक्शन के रूप में पास नहीं कर सकते हैं, इसके बजाय यह एक पॉइंटर को क्षय कर देगा और आप आकार खो देंगे। लेकिन C ++ में, आप सरणी के लिए एक संदर्भ पारित कर सकते हैं।
एक सरणी को संदर्भ द्वारा पास करने से प्रकारों का सटीक मिलान करने की आवश्यकता होती है। एक सरणी का आकार इसके प्रकार का हिस्सा है। इसका मतलब है कि हम हमारे लिए आकार जानने के लिए टेम्पलेट पैरामीटर एन का उपयोग कर सकते हैं।
यह भी सरल हो सकता है कि यह फ़ंक्शन एक वेक्टर लौटाता है। प्रभाव में उपयुक्त संकलक अनुकूलन के साथ, यह लग रहा है की तुलना में तेज होना चाहिए।
template<typename T, size_t N>
vector<T> convert_array_to_vector(const T (&source_array)[N]) {
return vector<T>(source_array, source_array+N);
}