दिलचस्प पोस्ट
Android में गतिविधियों के बीच डेटा पास करना क्यों जावा वर्गों कार्यान्वित इंटरफेस से एनोटेशन का उत्तराधिकार नहीं है? मुझे फ्लोटिंग प्वाइंट तुलना कैसे करनी चाहिए? 3 डी स्थिति को 2 डी स्क्रीन स्थिति में परिवर्तित करना पायथन में व्हाटस्पेस पर स्प्लिट स्ट्रिंग पायथन द्वारा प्रयुक्त स्ट्रिंग तुलना तकनीक एंड्रॉइड में मेरे स्थान से गंतव्य स्थान तक की दूरी गणना किसी फ़ाइल के लिए MD5 checksum की गणना करें डिजिटल सर्टिफिकेट: .truststore फ़ाइल का उपयोग करने के लिए .cer फाइल कैसे आयात करें? वेक्टर, स्ट्रैक्ट्स और एसटीडी :: ढूंढें लंबी मल्टी-लाइन स्ट्रिंग बनाने का पायथनिक तरीका रेल सर्वर ओएसएक्स 10.6.5 पर आरवीएम और रूबी 1.9.2-पी 0 का उपयोग करके mysql2 के साथ शुरू करने में विफल रहता है डिवाइस पर Android नकली स्थान? सी # का उपयोग करते हुए Excel फ़ाइल के डेटा को कैसे पढ़ें? जावा में सांत्वना से एक एकल अक्षर कैसे पढ़ा जाए (उपयोगकर्ता के प्रकार के रूप में)?

वेक्टर को एक वेक्टर जोड़ना

मान लें कि मेरे पास 2 मानक वैक्टर हैं:

vector<int> a; vector<int> b; 

यह भी कहें कि दोनों में लगभग 30 तत्व हैं

  • मैं सदिश बी को सदिश के अंत में कैसे जोड़ूं?

गंदा तरीका बी के माध्यम से दोहराया जाएगा और प्रत्येक तत्व को vector<int>::push_back() माध्यम से जोड़ना होगा, हालांकि मैं ऐसा नहीं करना चाहूंगा!

वेब के समाधान से एकत्रित समाधान "वेक्टर को एक वेक्टर जोड़ना"

 a.insert(a.end(), b.begin(), b.end()); 

या

 a.insert(std::end(a), std::begin(b), std::end(b)); 

दूसरा संस्करण एक अधिक सामान्य रूप से लागू समाधान है, क्योंकि b भी एक सरणी हो सकता है। हालांकि, इसे सी ++ 11 की आवश्यकता है

 std::copy (b.begin(), b.end(), std::back_inserter(a)); 

इसका उपयोग वेक्टर में होने वाले आइटम में कोई असाइनमेंट ऑपरेटर (जैसे कॉन्स्ट सदस्य नहीं) के रूप में किया जा सकता है।

अन्य सभी मामलों में यह समाधान उपरोक्त सम्मिलन समाधान की तुलना में असंभव है।

जबकि "कम्पाइलर आरक्षित कर सकता है" कह रहे हैं, इस पर भरोसा क्यों करते हैं? और स्थानांतरित शब्दों का स्वत: पता लगाने के बारे में क्या? और क्या begin और end साथ कंटेनर नाम के दोहराए जाने के बारे में?

क्या आप कुछ नहीं चाहते हैं, आप जानते हैं, सरल?

(पेंचलाइन के लिए main स्क्रॉल करें)

 #include <type_traits> #include <vector> #include <iterator> #include <iostream> template<typename C,typename=void> struct can_reserve: std::false_type {}; template<typename T, typename A> struct can_reserve<std::vector<T,A>,void>: std::true_type {}; template<int n> struct secret_enum { enum class type {}; }; template<int n> using SecretEnum = typename secret_enum<n>::type; template<bool b, int override_num=1> using EnableFuncIf = typename std::enable_if< b, SecretEnum<override_num> >::type; template<bool b, int override_num=1> using DisableFuncIf = EnableFuncIf< !b, -override_num >; template<typename C, EnableFuncIf< can_reserve<C>::value >... > void try_reserve( C& c, std::size_t n ) { c.reserve(n); } template<typename C, DisableFuncIf< can_reserve<C>::value >... > void try_reserve( C& c, std::size_t ) { } // do nothing template<typename C,typename=void> struct has_size_method:std::false_type {}; template<typename C> struct has_size_method<C, typename std::enable_if<std::is_same< decltype( std::declval<C>().size() ), decltype( std::declval<C>().size() ) >::value>::type>:std::true_type {}; namespace adl_aux { using std::begin; using std::end; template<typename C> auto adl_begin(C&&c)->decltype( begin(std::forward<C>(c)) ); template<typename C> auto adl_end(C&&c)->decltype( end(std::forward<C>(c)) ); } template<typename C> struct iterable_traits { typedef decltype( adl_aux::adl_begin(std::declval<C&>()) ) iterator; typedef decltype( adl_aux::adl_begin(std::declval<C const&>()) ) const_iterator; }; template<typename C> using Iterator = typename iterable_traits<C>::iterator; template<typename C> using ConstIterator = typename iterable_traits<C>::const_iterator; template<typename I> using IteratorCategory = typename std::iterator_traits<I>::iterator_category; template<typename C, EnableFuncIf< has_size_method<C>::value, 1>... > std::size_t size_at_least( C&& c ) { return c.size(); } template<typename C, EnableFuncIf< !has_size_method<C>::value && std::is_base_of< std::random_access_iterator_tag, IteratorCategory<Iterator<C>> >::value, 2>... > std::size_t size_at_least( C&& c ) { using std::begin; using std::end; return end(c)-begin(c); }; template<typename C, EnableFuncIf< !has_size_method<C>::value && !std::is_base_of< std::random_access_iterator_tag, IteratorCategory<Iterator<C>> >::value, 3>... > std::size_t size_at_least( C&& c ) { return 0; }; template < typename It > auto try_make_move_iterator(It i, std::true_type) -> decltype(make_move_iterator(i)) { return make_move_iterator(i); } template < typename It > It try_make_move_iterator(It i, ...) { return i; } #include <iostream> template<typename C1, typename C2> C1&& append_containers( C1&& c1, C2&& c2 ) { using std::begin; using std::end; try_reserve( c1, size_at_least(c1) + size_at_least(c2) ); using is_rvref = std::is_rvalue_reference<C2&&>; c1.insert( end(c1), try_make_move_iterator(begin(c2), is_rvref{}), try_make_move_iterator(end(c2), is_rvref{}) ); return std::forward<C1>(c1); } struct append_infix_op {} append; template<typename LHS> struct append_on_right_op { LHS lhs; template<typename RHS> LHS&& operator=( RHS&& rhs ) { return append_containers( std::forward<LHS>(lhs), std::forward<RHS>(rhs) ); } }; template<typename LHS> append_on_right_op<LHS> operator+( LHS&& lhs, append_infix_op ) { return { std::forward<LHS>(lhs) }; } template<typename LHS,typename RHS> typename std::remove_reference<LHS>::type operator+( append_on_right_op<LHS>&& lhs, RHS&& rhs ) { typename std::decay<LHS>::type retval = std::forward<LHS>(lhs.lhs); return append_containers( std::move(retval), std::forward<RHS>(rhs) ); } template<typename C> void print_container( C&& c ) { for( auto&& x:c ) std::cout << x << ","; std::cout << "\n"; }; int main() { std::vector<int> a = {0,1,2}; std::vector<int> b = {3,4,5}; print_container(a); print_container(b); a +append= b; const int arr[] = {6,7,8}; a +append= arr; print_container(a); print_container(b); std::vector<double> d = ( std::vector<double>{-3.14, -2, -1} +append= a ); print_container(d); std::vector<double> c = std::move(d) +append+ a; print_container(c); print_container(d); std::vector<double> e = c +append+ std::move(a); print_container(e); print_container(a); } 

हेह

अब कदम-डेटा-से- rhs, append-array-to-container के साथ, forward_list-to-container जोड़ें, move-container-from-lhs, @ DyP की सहायता के लिए धन्यवाद।

नोट करें कि उपरोक्त EnableFunctionIf<>... तकनीक के लिए धन्यवाद EnableFunctionIf<>... में संकलित नहीं करता है। इस परिपाटी में काम करता है।

यदि आप वेक्टर को अपने आप में जोड़ना चाहते हैं तो दोनों लोकप्रिय समाधान विफल हो जाएंगे:

 std::vector<std::string> v, orig; orig.push_back("first"); orig.push_back("second"); // BAD: v = orig; v.insert(v.end(), v.begin(), v.end()); // Now v contains: { "first", "second", "", "" } // BAD: v = orig; std::copy(v.begin(), v.end(), std::back_inserter(v)); // std::bad_alloc exception is generated // GOOD, but I can't guarantee it will work with any STL: v = orig; v.reserve(v.size()*2); v.insert(v.end(), v.begin(), v.end()); // Now v contains: { "first", "second", "first", "second" } // GOOD, but I can't guarantee it will work with any STL: v = orig; v.reserve(v.size()*2); std::copy(v.begin(), v.end(), std::back_inserter(v)); // Now v contains: { "first", "second", "first", "second" } // GOOD (best): v = orig; v.insert(v.end(), orig.begin(), orig.end()); // note: we use different vectors here // Now v contains: { "first", "second", "first", "second" }