C++ 使用std::copy_if for std::vector时发生断言错误

C++ 使用std::copy_if for std::vector时发生断言错误,c++,algorithm,iterator,assertions,C++,Algorithm,Iterator,Assertions,为什么在尝试执行以下操作时出现运行时错误: std::vector<int> vi; std::generate_n(std::back_inserter(vi),10,rand); std::vector<int> vi_1; vi_1.reserve(vi.size()); std::copy_if(vi.begin(),vi.end(),vi_1.begin(),std::bind2nd(std::greater<int>(),-20000));

为什么在尝试执行以下操作时出现运行时错误:

std::vector<int> vi;
std::generate_n(std::back_inserter(vi),10,rand);  

std::vector<int> vi_1;
vi_1.reserve(vi.size());
std::copy_if(vi.begin(),vi.end(),vi_1.begin(),std::bind2nd(std::greater<int>(),-20000));  
//Here (in copy_if) I'm getting assert error.
std::vector vi; std::generate_n(std::back_inserter(vi),10,rand); std::向量vi_1; vi_1.保留(vi.大小()); std::copy_if(vi.begin()、vi.end()、vi_1.begin()、std::bind2nd(std::greater()、-20000)); //这里(在copy_if中)我得到了断言错误。
vi_1.reserve
仅保留内存,但不会更改向量的实际大小。为此,您必须使用
resize

Reserve实际上并不创建对象,它只保证将向量增长到给定限制的每个调用都是O(1)。使用
resize

错误消息说什么?您确定需要
vi_1.reserve(vi.size())而非
vi_1.调整大小(vi.size())?如果您认为我更愿意保留
保留
并使用
返回插入器
,您也可以使用reserve和std::back\u inserter(vi\u 1),以避免创建无用的值。
推回
保证摊销O(1),即使没有
保留(n)
reserve
保证在向量大于
n
之前不会重新分配。这有两个重要影响:O(1)中的常数因子实际上是常数(不仅仅是摊销常数),而且非常小;并且,对已经存在的元素的迭代器、引用或指针都不会失效