2013-01-22 13 views
5

यादृच्छिक संख्याओं के वेक्टर उत्पन्न करने की कोशिश करते समय मैं एक std :: bad_alloc त्रुटि में ठोकर खा जाता हूं। मैं अब तक generate() प्रयोग करते हैं, लेकिन अभी भी उत्सुक हूँ क्यों यह असफलbad_alloc?

#include "search.h" 
#include "gtest/gtest.h" 

int _size = 100; 

std::vector<int> GetSortedVector(int size){ 
    //init vector 
    std::vector<int> v(size); 
    //fill with random numbers 
    for (std::vector<int>::size_type i=0; i < v.size(); i++) 
     v.push_back(std::rand()%(2*size)); 
    //return the setup vector 
    return v; 
} 

//triggered automatically 
TEST(BinarySearch, NonUniqueSorted){ 
    std::vector<int> v = GetSortedVector(_size);//nothing moves farther than this line 
} 

पी.एस .:: यहाँ मेरी कोड है।

उत्तर

8

v.push_back आकार बढ़ाता है, इसलिए i<v.size() कभी भी false नहीं है।

के बाद से अपने वेक्टर पहले से ही size लंबाई में है, तो आप

for (std::vector<int>::size_type i=0; i < v.size(); i++) 
    v[i] = std::rand()%(2*size); 

साथ यह बजाय भरने या reserve उपयोग करने की आवश्यकता:

std::vector<int> v; 
v.reserve(size); 

push_back रखने के लिए और size के खिलाफ जाँच करें। मैं std::generate का सुझाव नहीं दूंगा क्योंकि आपने कहा था कि आप पहले से ही ऐसा कर रहे हैं।

+0

पाश के लिए आरक्षण के मामले में क्षमता आकार नहीं के खिलाफ जांच करने के लिए संशोधित किया जाना चाहिए। – Kimi

+0

@ किमी सही, इसके बारे में भूल गए। –

+1

मुझे नहीं लगता कि 'क्षमता' के खिलाफ जांच करना एक अच्छा विचार होगा, क्योंकि जहां तक ​​मुझे पता है कि' रिजर्व 'को आवंटित करने की अनुमति है * (यदि संभवतः यह वास्तव में नहीं कर रहा हो)। इसके बजाय बस 'आकार' (फ़ंक्शन तर्क) के विरुद्ध जांचें। –

2

निम्न भाग में ज़ूम:

for (std::vector<int>::size_type i=0; i < v.size(); i++) 
     v.push_back(std::rand()%(2*size)); 

हर बार जब आप push_back() फोन, वेक्टर के आकार 1. की वृद्धि हुई है इसलिए, i < v.size() गलत पर मूल्यांकन कभी नहीं होगा और अपने पाश जब तक आप स्मृति से बाहर चलाने पर जाना होगा । इसे ठीक करने के लिए संभव तरीकों में से एक एक बार size() कब्जा करने के लिए, उदाहरण के लिए है:

for (std::vector<int>::size_type i=0, s = v.size(); i < s; i++) 
     v.push_back(std::rand()%(2*size)); 
+1

आपको यह उल्लेख करना चाहिए कि आपके बाद के सुझाव मूल सामग्री को संशोधित किए बिना वेक्टर ** बढ़ाते हैं। –

+2

मुझे संदेह है कि ओपी वास्तव में सौ सौ शून्य के बाद एक सौ छद्म-यादृच्छिक संख्या चाहता है। – aschepler

+0

दाएं। सवाल bad_alloc के बारे में था, और जगहों पर तत्वों को अपडेट करने का तरीका नहीं था। हालांकि आपके सभी सुझाव वैध हैं :) –

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

  • कोई संबंधित समस्या नहीं^_^