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)中的常数因子实际上是常数(不仅仅是摊销常数),而且非常小;并且,对已经存在的元素的迭代器、引用或指针都不会失效