在尝试生成随机数的向量时,我偶然发现了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
}
P.S。:我现在使用generate()
,但我仍然很好奇为什么会失败。
答案 0 :(得分: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
,因为你说你已经这样做了。
答案 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()
永远不会计算为false,并且循环将继续,直到内存不足为止。修复它的一种可能方法是捕获size()
一次,例如:
for (std::vector<int>::size_type i=0, s = v.size(); i < s; i++)
v.push_back( std::rand()%(2*size) );