2013-01-22 17 views
5

Podczas próby wygenerowania wektora liczb losowych natknę się na błąd std :: bad_alloc. Oto mój kod:bad_alloc podczas inicjowania i wypełniania wektora?

#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 
} 

P.S .: ja używam generate() teraz, ale nadal jestem ciekawy, dlaczego nie udało się.

Odpowiedz

8

v.push_back zwiększa rozmiar, więc i<v.size() nigdy nie jest false.

Ponieważ wektor jest już size długości, trzeba wypełnić go

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

lub użyj reserve zamiast:

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

utrzymać push_back i sprawdzić przed size. Nie będę sugerował, std::generate, ponieważ powiedziałeś, że już to robisz.

+0

W przypadku rezerwacji dla pętli musi być zmodyfikowany, aby sprawdzić przed pojemności nie wielkości. – Kimi

+0

@ Kimim, zapomniałem o tym. –

+1

Nie sądzę, by sprawdzanie "zdolności" byłoby dobrym pomysłem, ponieważ o ile wiem, "rezerwa" jest * dozwolona * do przejęcia (nawet jeśli może praktycznie nie jest to możliwe). Zamiast tego sprawdź po prostu 'size' (argument funkcji). –

2

zoom w dalszej części:

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

każdym razem dzwonić push_back(), rozmiarów Vector jest zwiększona o 1. Dlatego i < v.size() nigdy oceni false i pętla będzie trwać aż zabraknie pamięci . Jednym z możliwych sposobów, aby to naprawić jest uchwycenie size() raz, na przykład:

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

Powinieneś wspomnieć, że twoja ostatnia sugestia zwiększa wektor ** bez ** modyfikowania oryginalnej treści. –

+2

Wątpię, czy OP chce stu zer po którym następuje sto liczb pseudolosowych. – aschepler

+0

W prawo. Pytanie dotyczyło bad_alloc, a nie sposobu aktualizacji elementów. Chociaż wszystkie twoje sugestie są ważne :) –

Powiązane problemy