2013-01-22 14 views
5

Trong khi cố gắng tạo một vectơ các số ngẫu nhiên, tôi vấp phải một lỗi std :: bad_alloc. Dưới đây là mã của tôi:bad_alloc trong khi khởi tạo và điền vào một vectơ?

#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 .: Tôi sử dụng generate() bởi bây giờ, nhưng tôi vẫn tò mò tại sao nó thất bại.

Trả lời

8

v.push_back tăng kích thước, vì vậy i<v.size() không bao giờ là false.

Kể từ vector của bạn đã size dài, bạn cần phải điền nó với

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

hoặc sử dụng reserve thay vì:

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

giữ push_back và đối chiếu với size. Tôi sẽ không đề xuất std::generate vì bạn đã nói bạn đã làm như vậy.

+0

Trong trường hợp đặt vòng lặp phải được sửa đổi để kiểm tra dung lượng không kích thước. – Kimi

+0

@Kimi đúng, quên mất điều đó. –

+1

Tôi không nghĩ rằng việc kiểm tra đối với 'dung lượng' sẽ là một ý tưởng hay, vì theo như tôi biết' dự trữ' được * cho phép * để phân bổ (ngay cả khi có lẽ không thực tế). Thay vì chỉ kiểm tra 'size' (đối số hàm). –

2

zoom vào phần sau:

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

Mỗi lần bạn gọi push_back(), kích thước vector được tăng lên bằng cách 1. Do đó, i < v.size() sẽ không bao giờ đánh giá sai và vòng lặp của bạn sẽ tiếp tục cho đến khi bạn chạy ra khỏi bộ nhớ . Một trong những cách có thể khắc phục nó là chụp size() một lần, ví dụ:

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

Bạn nên đề cập rằng đề xuất sau của bạn làm tăng véc tơ ** mà không ** sửa đổi nội dung gốc. –

+2

Tôi nghi ngờ OP thực sự muốn một trăm số không theo sau là một trăm số giả ngẫu nhiên. – aschepler

+0

Phải. Câu hỏi đặt ra là về bad_alloc và không phải cách cập nhật các phần tử tại chỗ. Mặc dù tất cả các đề xuất của bạn là hợp lệ :) –