5

乱数のベクトルを生成しようとしているときに、std::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
}

PS:私はgenerate()今までに使用していますが、なぜ失敗したのかまだ興味があります。

4

2 に答える 2

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あなたはすでにそのようにやっていると言ったので、私は提案しません。

于 2013-01-22T20:43:19.110 に答える
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()falseと評価されることはなく、メモリがなくなるまでループが続行されます。size()これを修正するための可能な方法の1つは、たとえば次のように1回キャプチャすることです。

for (std::vector<int>::size_type i=0, s = v.size(); i < s; i++)
        v.push_back( std::rand()%(2*size) );
于 2013-01-22T20:43:41.873 に答える