दिलचस्प पोस्ट
एचटीएमएल पेज को गतिशील रूप से jQuery में डिवेल में लोड करें मैं नाम या प्रकार से WPF नियंत्रण कैसे पा सकता हूं? पायथन के लिए क्लास विधियों क्या हैं? पूर्णांक प्रभाग: आप डबल कैसे बनाते हैं? जावा और .NET स्ट्रिंग literals कहाँ रहते हैं? क्यों नहीं कई FINDSTR उदाहरण के साथ कई शाब्दिक खोज तार एक मैच मिल रहा है? कोणीय- प्रपत्र: गतिशील रूप से उपयोगकर्ता क्लिक पर प्रपत्र फ़ील्ड जोड़ना पायथन के बारे में सॉर्ट () विधि में बनाया गया है HTML5 के साथ ऑडियो कैप्चरिंग मैं जावास्क्रिप्ट में डायनामिक वेरिएबल कैसे घोषित और उपयोग करूं? NullPointerException onCreate में दृश्यों को एक्सेस करना () उपयोगकर्ता को पीडीएफ़ पर पीडीएफ़ को एक्सपोर्ट करें जावास्क्रिप्ट का उपयोग कर एसक्यूएल सर्वर में औसत गणना करने के लिए फ़ंक्शन पायथन REST (वेब ​​सेवा) ढांचे की सिफारिशें? RegisterStartupScript और RegisterClientScriptBlock के बीच अंतर?

अपने आप को एक वेक्टर संलग्न करने का अच्छा तरीका

मैं वेक्टर की सामग्री की नकल करना चाहता हूं और चाहता हूं कि वे मूल वेक्टर यानी v[i]=v[i+n] for i=0,2,...,n-1 के अंत में जोड़ा जाए

मैं इसे करने के लिए एक अच्छी तरह से तलाश कर रहा हूं, एक पाश के साथ नहीं। मैंने std::vector::insert देखा था, लेकिन पुनरावृत्त संस्करण एक इटरेटर को *this ( *this व्यवहार अपरिभाषित है) प्रतिबंधित करता है।

मैंने भी std::copy की कोशिश की है (लेकिन इसके परिणामस्वरूप विभाजन गलती हुई):

copy( xx.begin(), xx.end(), xx.end());

वेब के समाधान से एकत्रित समाधान "अपने आप को एक वेक्टर संलग्न करने का अच्छा तरीका"

वाह। इतने सारे उत्तर जो पास हैं, सभी सही टुकड़ों के साथ कोई भी नहीं मूल आकार को याद रखने के साथ आपको दोनों resize (या reserve ) और copy_n आवश्यकता है

 auto old_count = xx.size(); xx.resize(2 * old_count); std::copy_n(xx.begin(), old_count, xx.begin() + old_count); 

या

 auto old_count = xx.size(); xx.reserve(2 * old_count); std::copy_n(xx.begin(), old_count, std::back_inserter(xx)); 

reserve का उपयोग करते समय, copy_n आवश्यक है क्योंकि end() इटरेटर end() एक तत्व को इंगित करता है … जिसका अर्थ है कि यह पहले प्रविष्टि के "सम्मिलन बिंदु से पहले" नहीं है, और अमान्य हो जाता है


23.3.6.5 [vector.modifiers] वादा करता है कि insert और [vector.modifiers] लिए:

टिप्पणियां: यदि नए आकार की पुरानी क्षमता से अधिक है तो पुन : स्थान का कारण बनता है। यदि कोई पुन: स्थान नियोजन नहीं होता है, तो सम्मिलन बिंदु से पहले सभी iterators और संदर्भ मान्य होंगे। यदि कोई अपवाद प्रतिलिपि कन्स्ट्रक्टर, कंसट्रक्टर, असाइनमेंट ऑपरेटर को स्थानांतरित करें, या टी के असाइनमेंट ऑपरेटर को स्थानांतरित करने के अलावा अन्य किसी भी इंपुटइटरेटर ऑपरेशन द्वारा फेंक दिया जाता है, तो कोई प्रभाव नहीं होता है। यदि अपवाद एक गैर-कॉपी इन्सटेबल टी के चालन निर्माता द्वारा फेंक दिया जाता है, तो ई एफएफ एक्ट्स अनिर्दिष्ट हैं।

मैं इसे ऐसा करूँगा:

 #include <algorithm> #include <vector> #include <utility> int main(int argc, char* argv[]) { std::vector<int> v1 = { 1, 2, 3, 4, 5 }; { std::vector<int> v2(v1.begin(), v1.end()); std::copy(v1.begin(), v1.end(), std::back_inserter(v2)); std::swap(v1, v2); } return 0; } 

संपादित करें: मैंने थोड़ा और अधिक कुशल संस्करण जोड़ा।

 #include <algorithm> #include <vector> #include <utility> int main(int argc, char* argv[]) { std::vector<int> v1 = { 1, 2, 3, 4, 5 }; { typedef std::move_iterator<decltype(v1)::iterator> VecMoveIter; std::vector<int> v2(v1); std::copy(VecMoveIter(v1.begin()), VecMoveIter(v1.end()), std::back_inserter(v2)); v1 = std::move(v2); } return 0; } 

डुप्लिकेट के एक से अधिक स्लॉट जोड़ने के लिए

  int main() { std::vector<int> V; V.push_back(1); V.push_back(2); int oldSize = V.size(); int newSize = oldSize; int nDupSlot = 4; V.resize(nDupSlot * oldSize); for(int i=0; i<(nDupSlot-1); ++i) { std::copy_n(V.begin(), oldSize, V.begin() + newSize); newSize = newSize + oldSize; } for(int i =0; i<V.size(); ++i) { std::cout<<V[i]; } return 0; } 

आउटपुट:

 12121212 

यह सबसे प्रभावी तरीका नहीं है, लेकिन यह सुनिश्चित करना आसान है:

 std::vector<int> toAppend(xx); xx.insert(xx.end(), toAppend.begin(), toAppend.end();