2012-11-27 21 views
7

मुझे इस समय एक मस्तिष्क का झटका लग रहा है और मैं एक सरणी लेने के लिए एक तेज़ तरीका ढूंढ रहा हूं और इसे आधा पास एक समारोह में भेजता हूं। अगर मेरे पास दस तत्वों में से एक सरणी थी, तो कुछ भाषाओं में मैं ए [5:] को फ़ंक्शन में कुछ पास कर सकता था और इसके साथ किया जा सकता था। क्या सी ++ में कोई समान निर्माण है? जाहिर है, मैं लूपिंग फ़ंक्शन से बचने और सॉर्ट करना चाहता हूं।क्या किसी सरणी से उप सरणी प्राप्त करने के लिए C++ में कोई तरीका है?

+6

शायद आपके फ़ंक्शन को इटरेटर लेना चाहिए। – chris

+1

आप सी ++ में फ़ंक्शंस के लिए सरणी पास नहीं कर सकते हैं क्योंकि C++ में सरणी मान नहीं हैं। तो आपका काम वास्तव में क्या लेता है? – melpomene

+0

मेरे पास एक सरणी int [] a = {1,2,3,4,5,6,7,8,9,10} होगी। मैं फिर एक उप सरणी int [] a1 = {6,7,8,9,10} प्राप्त करने का एक तरीका ढूंढ रहा हूं। –

उत्तर

7

हां। सादे सी में आप पॉइंटर्स का उपयोग करते हैं, लेकिन सी ++ में आप किसी भी प्रकार के इटरेटर का उपयोग कर सकते हैं (एक पॉइंटर को इटरेटर माना जा सकता है)।

template<typename Iter> 
void func(Iter arr, size_t len) { ... } 

int main() { 
    int arr[10]; 
    func(arr, 10); // whole array 
    func(arr, 5);  // first five elements 
    func(arr + 5, 5); // last five elements 

    std::vector<Thing> vec = ...; 
    func(vec.begin(), vec.size());   // All elements 
    func(vec.begin(), 5);     // first five 
    func(vec.begin() + 5, vec.size() - 5); // all but first 5 

    return 0; 
} 

ठेठ चाल सरणी के पहले तत्व के लिए सूचक गुजरती हैं, और फिर एक अलग तर्क का उपयोग सरणी की लंबाई पारित करने के लिए है। दुर्भाग्य से कोई सीमा जांच नहीं है, इसलिए आपको इसे सही करने के लिए सावधान रहना होगा या आप अपनी याददाश्त पर लिखेंगे।

आप आधा खुली श्रेणियों का भी उपयोग कर सकते हैं। यह करने का यह सबसे आम तरीका है। मानक पुस्तकालय में कई फ़ंक्शन (जैसे std::sort) इस तरह से काम करते हैं।

template<class Iter> 
void func(Iter start, Iter end) { ... } 

int main() { 
    int arr[10]; 
    func(arr, arr + 10);  // whole array 
    func(arr, arr + 5);  // first five elements 
    func(arr + 5, arr + 10); // last five elements 

    std::vector<Thing> vec = ...; 
    func(vec.begin(), vec.end());  // whole vector 
    func(vec.begin(), vec.begin() + 5); // first five elements 
    func(vec.begin() + 5, vec.end()); // all but the first five elements 

    return 0; 
} 

फिर, कोई सीमा जांच नहीं है।

+0

मुझे लगता है कि आप जिस टेम्पलेटिंग के बारे में बात कर रहे थे वह है: 'टेम्पलेट शून्य func (कॉन्स इटर और स्टार्ट, कॉन्स इटर एंड एंड) {...} ' – Corbin

+1

बस' टेम्पलेट <टाइपनाम Iter> शून्य func (Iter प्रारंभ, Iter end)' –

+0

यदि आप सीमा शुल्क जांच सीमाओं का उपयोग करना चाहते हैं, 'और vec.at (5) ', या' vec.begin() + अधिकतम (5, vec.size())' अगर '5' वास्तव में 'अधिकतम 5' है । – jthill

संबंधित मुद्दे