दिलचस्प पोस्ट
Android से एक JSON HTTP POST अनुरोध भेजा जा रहा है पहले const या const के बाद? फाइल या असेंबली को लोड नहीं किया जा सका 'न्यूटॉन्सफ्ट। जेसन, संस्करण = 4.5.0.0, संस्कृति = तटस्थ, पब्लिककेय टोकन = 30 एडी 4 एफ 6 बी 2 ए 6 ए' जावा का उपयोग कर मैं एक छवि का आकार कैसे बदल सकता / सकती हूं? एंड्रॉइड: .apk प्रोग्राममैटिक रूप से इंस्टॉल करें क्या विंडोज के लिए unistd.h के लिए एक प्रतिस्थापन (दृश्य सी) है? वैरिएबल AJAX फ़ंक्शन से वापस नहीं मिलता है । htaccess उपडोमेन को निर्देशिका में फिर से लिखना एक जार में निहित संसाधन लोड करें कैसे एक div अंदर एक तत्व को स्क्रॉल करने के लिए? संपादित करें, सहेजें, स्वयं को संशोधित करें HTML दस्तावेज़; प्रारूप HTML, जावास्क्रिप्ट उत्पन्न एक एकल वर्ण और ट्रिम स्ट्रिंग में सफेद स्थान के दृश्यों को संकुचित करें जावास्क्रिप्ट में ऑब्जेक्ट के प्रकार का नाम कैसे प्राप्त करूं? SQL क्वेरी: नवीनतम एन को छोड़कर तालिका से सभी अभिलेख हटाएं? एंजरीजेएस में यूआई-राउटर के साथ डिफॉल्ट सबटेस्ट के लिए एक राज्य को रीडायरेक्ट करें

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

मैं वेक्टर की सामग्री की नकल करना चाहता हूं और चाहता हूं कि वे मूल वेक्टर यानी 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();