vvint1 और vvint2 द्वारा ली गई मेमोरी में अपेक्षित अंतर (यदि कोई हो) क्या है? क्या हर बार push_back होने पर vitest1 को एक नई मेमोरी स्थिति में कॉपी किया जाता है? क्या हर बार push_back होने पर vitest2 को एक नई मेमोरी स्थिति में कॉपी किया जाता है?

typedef vector<int> vint_t;
typedef vector<vint_t> vvint_t;
size_t nvec = 2;
size_t nvvec = 3;
vvint_t vvint1(nvvec), vvint2(nvvec);
vint_t vitest2(nvec, 1);
for ( j = 0; j < nvvec; j++ ) {
    vint_t vitest1(nvec, 2);
    vvint1.push_back(vitest1);
    vvint2.push_back(vitest2);
}
0
sancho.s ReinstateMonicaCellio 26 फरवरी 2020, 21:41
2
मुझे लगता है कि आपको अपने प्रश्न को संशोधित करने की आवश्यकता हो सकती है, ऐसा लगता है कि एक टाइपो ने इसे गिरा दिया होगा; यह वर्तमान में "vvint1 और vvint1" के बीच अंतर पूछता है। जो एक केले और एक केले के बीच के अंतर के समान है।
 – 
Tommy
26 फरवरी 2020, 21:46
1
vvint1 और vvint2 एक जैसे होंगे। हर बार जब आप push_pack का उपयोग करते हैं तो दोनों वेक्टर को कॉपी करते हैं। FWIW, एक 2d-वेक्टर वह नहीं है जो आप चाहते हैं। int** की तरह, std::vector<std::vector<int>> में पंक्तियों के बीच डेटा स्थान नहीं है। निरंतरता की कमी प्रदर्शन में बाधा डाल सकती है। इसके बजाय, आपको क्या करना चाहिए एक वर्ग का उपयोग करके एक एसडी संरचना का अनुकरण करना और 2 डी इंडेक्स को 1 डी इंडेक्स में अनुवाद करने के लिए गणित का उपयोग करके 1 डी वेक्टर में सभी डेटा संग्रहीत करना।
 – 
NathanOliver
26 फरवरी 2020, 21:49
2
असंबंधित: नामों के बीच समानता के कारण देर-सबेर कोई व्यक्ति vint_t और vvint_t को मिलाने वाला है और क्योंकि नाम इतने समान हैं कि इसका पता लगाना मुश्किल होगा।
 – 
user4581301
26 फरवरी 2020, 22:13
1
- फिक्स्ड (भले ही यह स्पष्ट था कि मैं क्या पूछना चाहता था)। धन्यवाद।
 – 
sancho.s ReinstateMonicaCellio
26 फरवरी 2020, 22:16
2
vvint_t vvint1(nvvec), vvint2(nvvec); aaaaaaaahhh यह इतना अपठनीय कोड है।
 – 
bolov
26 फरवरी 2020, 22:23

2 जवाब

दोनों vvint1 और vvint2 शुरू में nvvec = 3 डिफ़ॉल्ट-निर्मित सदस्यों (यानी int के खाली वैक्टर) के साथ बनाए गए हैं।

push_back हमेशा या तो कॉपी करता है या चलता है, लेकिन इस मामले में आप प्रतिद्वंद्विता संदर्भों की आपूर्ति नहीं कर रहे हैं, इसलिए आपको प्रतियां मिलेंगी। उस पर अधिक जानकारी के लिए std::move देखें।

आप दोनों वैक्टरों को समान संख्या में चीजें दबा रहे हैं। इसलिए vvint1 और vvint2 दोनों एक ही आकार के होंगे।

1
Tommy 26 फरवरी 2020, 22:52

vvint1 और vvint2 मेमोरी आवश्यकताएं हैं:

  1. (स्टैक पर, उदाहरण में) sizeof(vector<vector<int>>) स्वयं वस्तुओं के लिए, जो समान है (vector आमतौर पर आंतरिक प्रकार की परवाह किए बिना 2-3 पॉइंटर्स होते हैं);
  2. (ढेर पर) 2 * nvvec * sizeof(vector<int>) सामग्री के लिए (nvvec शुरू में और nvvec push_back-लूप में); फिर से, vvint1 और vvint2 के लिए भी ऐसा ही है;
  3. (ढेर पर) इन वैक्टर में संग्रहीत प्रत्येक वेक्टर की सामग्री। चूंकि वेक्टर मेमोरी साझा नहीं करते हैं, और आप उन्हें मूल्य के आधार पर स्टोर करते हैं, nvec * nnvec * sizeof(int)। फिर वही।

तो समग्र आवश्यकताएं समान हैं: sizeof(vector<vector<int>>) + nvvec * sizeof(vector<int>) + nvec * nnvec * sizeof(int)

सादा vector<int> कम जगह लेगा क्योंकि आइटम 2 लागू नहीं होगा। लेकिन जो अधिक महत्वपूर्ण है वह यह है कि vvint_t में, आंतरिक वैक्टर अलग-अलग लंबाई के हो सकते हैं, और किसी भी आंतरिक वेक्टर का आकार बदलना दूसरों को प्रभावित नहीं करता है। लेकिन यह जटिलता जोड़ता है, इसलिए जब तक आपको वास्तव में इसकी आवश्यकता न हो, फ्लैट वेक्टर का उपयोग करना और सूचकांक की गणना करना आसान है; इमेजिंग पुस्तकालय इसे इस तरह से करते हैं।

दूसरे भाग के संबंध में, दोनों vitests प्रत्येक push_back पर कॉपी किए गए हैं। लेकिन C++11 के बाद से, आप इसके बजाय स्थानांतरित करने के लिए vvint1.push_back(std::move(vitest1)); (या vvint1.emplace_back(std::move(vitest1));) लिख सकते हैं। वैक्टर के लिए जिसका अर्थ है कि नव-निर्मित वेक्टर vitest1 सामग्री को कॉपी किए बिना उसका स्वामित्व लेता है (इसलिए vitest1 खाली हो जाता है)। यह स्मृति आवश्यकताओं को नहीं बदलता है, लेकिन आवंटन को कम करता है क्योंकि vitest (निर्माण पर) द्वारा आवंटित स्थान को मुक्त होने के बजाय पुन: उपयोग किया जाएगा (विनाश पर, प्रत्येक पुनरावृत्ति के अंत में)।

0
numzero 1 मार्च 2020, 18:21
शायद 2 * nvvec * sizeof(vector<int>)? (दिया गया है कि यह nvvec से शुरू होता है और push_backs हैं)।
 – 
sancho.s ReinstateMonicaCellio
27 फरवरी 2020, 18:05
उफ़, वह चूक गया। धन्यवाद। उत्तर संपादित किया।
 – 
numzero
1 मार्च 2020, 18:21