【问题标题】:Assertion error while using std::copy_if for std::vector将 std::copy_if 用于 std::vector 时出现断言错误
【发布时间】:2012-01-25 09:21:41
【问题描述】:

为什么我在尝试执行操作时遇到运行时错误:

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.

【问题讨论】:

  • 错误信息是什么意思?
  • 您确定需要vi_1.reserve(vi.size()); 而不是vi_1.resize(vi.size());

标签: c++ algorithm iterator assertions


【解决方案1】:

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

【讨论】:

  • 你也可以使用reserve和std::back_inserter(vi_1)
  • 如果我认为我宁愿保留reserve 并使用back_inserter,以避免创建无用的值。
  • push_back 保证摊销 O(1),即使没有 reserve(n)reserve 保证在向量变得大于 n 之前不会重新分配。这有两个重要的影响:O(1) 中的常数因子实际上是常数(不仅仅是一个摊销常数),而且非常小;并且没有迭代器、引用或指向现有元素的指针将失效
【解决方案2】:

vi_1.reserve 只是保留内存,不会改变向量的实际大小。为此,您必须使用resize

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多