2013-04-08 7 views
13

द्वारा वेक्टर पासिंग सामान्य सी सरणियों का उपयोग करते हुए मैं ऐसा ही कुछ करना चाहते हैं: अबसंदर्भ

void do_something(int el, int **arr) 
{ 
    *arr[0] = el; 
    // do something else 
} 

, मैं वेक्टर के साथ मानक सरणी बदलना चाहते हैं, और प्राप्त करने के लिए यहाँ एक ही परिणाम:

void do_something(int el, std::vector<int> **arr) 
{ 
    *arr.push_front(el); // this is what the function above does 
} 

लेकिन यह प्रदर्शित करता है "अभिव्यक्ति में वर्ग प्रकार होना चाहिए"। यह ठीक से कैसे करें?

+0

'' पूर्णांक ** arr''? ? एक 2 डी सरणी सीधे कैसे असाइन करें? यदि आपको 2 डी सरणी की आवश्यकता है, '' foo (वेक्टर > और arr) ''। – gongzhitaao

+1

मुझे लगता है कि वह शायद एक सरणी में एक सूचक को दो आयामी सरणी नहीं पारित करने का प्रयास कर रहा था .. अगर मैं गलत हूं तो मुझे सही करें – Mppl

+0

बहुत सारे उत्तर हैं लेकिन किसी ने भी ध्यान नहीं दिया है कि यह पॉइंटर्स की एक सरणी है, न कि एक सरणी के लिए सूचक। वे एक 'std :: वेक्टर 'चाहते हैं। –

उत्तर

7
void do_something(int el, std::vector<int> **arr) 

होना चाहिए

void do_something(int el, std::vector<int>& arr) 
{ 
    arr.push_back(el); 
} 

दर्रा संदर्भ द्वारा सी में & उपयोग करने के लिए ++ सरलीकृत किया गया है।

+0

@taocp, 'सी द्वारा संदर्भित किया गया है' और सी ++ में उपयोग करने के लिए सरलीकृत किया गया है। – gen

+1

@gen यह खराब phrasing imho है। सी ++ में वास्तव में क्या बदल गया था कि वास्तव में पास-दर-संदर्भ _at all_ है। सी नहीं करता है। यह पॉइंटर्स पास करके एक ही परिणाम प्राप्त करता है, और यह निर्णय लेता है कि पॉइंटर अव्यवस्था के परिणाम को बदलने से संकेत मिलता है कि इसकी मूल जगह (एक अस्थायी प्रति नहीं) में इंगित मूल्य को संशोधित करता है। लेकिन यह पास-दर-संदर्भ नहीं है। सूचक मूल्य से पारित किया जाता है। –

9

आप std::vector<int>& arr और पूर्णांक मान का तर्क लेने के लिए अपने समारोह निर्धारित करते हैं तो आप push_back कि समारोह के अंदर उपयोग कर सकते हैं:

void do_something(int el, std::vector<int>& arr) 
{ 
    arr.push_back(el); 
    //.... 
} 

उपयोग:

std::vector<int> arr; 
do_something(1, arr); 
1

आप उपयोग करने के लिए की जरूरत नहीं है ** एआर, आप या तो उपयोग कर सकते हैं:

void do_something(int el, std::vector<int> *arr){ 
    arr->push_back(el); 
} 

या:

void do_something(int el, std::vector<int> &arr){ 
    arr.push_back(el); 
} 

** आगमन कोई मतलब नहीं है, लेकिन अगर आप इसे का उपयोग जोर देते हैं, यह इस तरह से कार्य करें:

void do_something(int el, std::vector<int> **arr){ 
    (*arr)->push_back(el); 
} 

लेकिन फिर से ऐसा करने के लिए कोई कारण नहीं है ...

+3

वेक्टर के पास 'push_front' नहीं है। – Rapptz

3

आप कर सकते हैं संदर्भ द्वारा पास वेक्टर सिर्फ इस तरह:

void do_something(int el, std::vector<int> &arr){ 
    arr.push_back(el); 
} 

हालांकि, ध्यान दें कि यह च कि एकीकरण हमेशा वेक्टर के पीछे पर एक नया तत्व जोड़ें, जबकि आपके सरणी फ़ंक्शन वास्तव में पहले तत्व को संशोधित करता है (या इसे मान प्रारंभ करता है)

आदेश बिल्कुल वैसा ही परिणाम प्राप्त करने में आप लिखना चाहिए:

void do_something(int el, std::vector<int> &arr){ 
    if (arr.size() == 0) { // can't modify value of non-existent element 
     arr.push_back(el); 
    } else { 
     arr[0] = el; 
    } 
} 

इस तरह से आप या तो पहले तत्व जोड़ (यदि वेक्टर खाली है) में या (अपने मूल्य को संशोधित अगर वहाँ पहले तत्व पहले से मौजूद है)।

25

आप फ़ंक्शन में इसे संशोधित करने के लिए संदर्भ द्वारा कंटेनर को पास कर सकते हैं। अन्य उत्तरों को संबोधित नहीं किया गया है कि std::vector में push_front सदस्य फ़ंक्शन नहीं है।आप हे (एन) प्रविष्टि के लिए vector पर insert() सदस्य फ़ंक्शन का उपयोग कर सकते हैं:

void do_something(int el, std::vector<int> &arr){ 
    arr.insert(arr.begin(), el); 
} 

या बजाय परिशोधित हे (1) प्रविष्टि के लिए std::deque का उपयोग करें:

void do_something(int el, std::deque<int> &arr){ 
    arr.push_front(el); 
}