2013-05-15 34 views
5

के बराबर असाइन करें मेरे पास एक सी-शैली सरणी है, और मैं इसे एक क्यूवीक्टर को असाइन करना चाहता हूं। अगर मैं std :: वेक्टर उपयोग कर रहे थे, मैं assign() इस्तेमाल किया होगा:std :: vector :: QVector

int arr[] = { 1, 2, 3, 4, 5 }; 
std::vector<int> v; 
v.assign(arr, arr + sizeof(arr)/sizeof(int)); 

लेकिन QVector के लिए मैं एक ऐसी ही assign() विधि, या किसी भी सीमा स्वीकार निर्माता नहीं पा सके।

मैंने पहले से ही एक लूप को कोड करने के लिए कोड किया है, लेकिन मुझे आश्चर्य हुआ कि ऐसा कोई बुनियादी कार्य नहीं था, क्या वास्तव में ऐसा है, या समकक्ष है?

+0

बस एक साइड नोट के रूप में, आपके उदाहरण में मैं 'असाइन', लेकिन' वेक्टर 'का भी उपयोग नहीं करता। –

उत्तर

5

आप उपयोग कर सकते हैं क्यूटी के qCopy():

int arr[] = { 1, 2, 3, 4, 5 }; 
QVector<int> v(5); 
qCopy(arr, arr+5, v.begin()); 

या आप निश्चित रूप से std::copy() उपयोग कर सकते हैं।

int arr[] = { 1, 2, 3, 4, 5 }; 
QVector<int> v(5); 
std::copy_n(&arr, 5, v.begin()); 
// or more general: 
QVector<int> v2; 
std::copy(std::begin(arr), std::end(arr), std::back_inserter(v2)); 
// without begin/end 
std::copy(arr, arr + 5, std::back_inserter(v2)); 
+0

@pmr नाइस, बहुत slicker। – cmannett85

+2

इसका कोई प्रभाव नहीं है। यह पीठ पर नए तत्व धक्का देता है। यह केवल तभी काम करता है जब 'क्यूवेक्टर' शुरू होने के लिए खाली हो। – juanchopanza

+0

@juanchopanza यह वही प्रभाव है जैसे 'वेक्टर'-आधारित कोड ओपी प्रतिकृति है, हालांकि आप सिद्धांत में सही हैं। – cmannett85

1

वहाँ fromStdVector() है, जो आपको एक std::vector से एक QVector बनाने के लिए अनुमति देता है:

int arr[] = { 1, 2, 3, 4, 5 }; 
std::vector<int> v; 
v.assign(arr, arr + sizeof(arr)/sizeof(arr[0])); 
QVector<int> qvec = QVector<int>::fromStdVector(v); 
+0

मुझे नहीं लगता कि यह ओपी चाहता है। वह सी-स्टाइल सरणी को 'क्यूवीक्टर' को असाइन करना चाहता है। वह 'वेक्टर' को 'वेक्टर' को असाइन नहीं करना चाहता है। – pmr

+0

एकमात्र समस्या यह है कि हम एक अस्थायी वस्तु (यानी प्रदर्शन) को बनाते और नष्ट करते हैं। – sashoalm

+0

@pmr हालांकि सरणी को 'std :: vector' में परिवर्तित करने के बाद 'std :: vector' से' QVector' में रूपांतरण किया जा सकता है, लेकिन मैं मानता हूं कि यह शायद एक साधारण 'std :: copy' से कम है (विशेष रूप से प्रदर्शन के संबंध में)। लेकिन इस तरह आप इसे केवल 1 सिंगल प्रारंभिक लाइन में कर सकते हैं, इसके बाद प्रारंभ करने के बजाय प्रतिलिपि बनाने के बाद (निश्चित रूप से केवल अगर यह पूरी तरह से प्रारंभिक अस्थायी 'std :: vector' के लिए इस पूरे' असाइन 'पागलपन को छोड़ना है)। –

-2

सरल प्रकार के लिए (जैसे int, चार, शून्य * ... आदि), आप (जैसे std :: स्ट्रिंग) की :: memcpy

int arr[] = { 1, 2, 3, 4, 5 }; 

const int CNT = sizeof(arr)/sizeof(int); 
QVector<int> v(CNT); 

// memcpy may be faster than std::copy_n in some compiler 
::memcpy(v.data(), arr, CNT * sizeof(int)); 

वस्तुओं के लिए लाभ ले सकते हैं, आगमन से वी

वस्तुओं कॉपी करने के लिए एक पाश लिखने

तो बस आह्वान कॉपी-कंस्ट्रक्टर्स एक-एक करके

जैसे

std::string arr[] = { std::string("a"), std::string("b"), std::string("c") }; 
const int CNT = sizeof(arr)/sizeof(std::string); 
QVector<std::string> v(CNT); 
for(size_t i = 0; i < CNT ; ++i) 
    v[i] = arr[i]; 

आगमन में प्रत्येक वस्तु के लिए प्रति निर्माता के रूप में एक-एक करके लागू किया जाना चाहिए, मुझे यकीन है कि वहाँ एक तेजी से समाधान नहीं होगा हूँ (यहां तक ​​कि आप std :: प्रतिलिपि (का उपयोग करें))।

और उपरोक्त कोड कुछ संकलकों में std :: प्रतिलिपि की तुलना में छोटे कोड आकार का परिणाम हो सकता है।

+0

memcpy std :: तारों के वेक्टर के लिए काम नहीं करेगा, हालांकि। यह कोड संभावित बग का कारण बन सकता है। – sashoalm

+3

यह एक घृणा है। – pmr

+1

* कभी भी * सी ++ कंटेनर क्लास पर मेमसेट जैसी किसी भी चीज़ का उपयोग न करें। बस मत करो –

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