首页 文章

删除矢量末尾的一部分而不重新分配

提问于
浏览
4

通过C矢量文档,pop_back()是一个不会导致向量数据重新分配的函数 . 但是,这仅适用于删除向量的一个成员 . 我试图找到一种从矢量末尾擦除多个成员的方法 . 最初我以为我会在一个小的for循环中调用pop_back()但是如果有一个更方便的函数可以为我做这个游戏我会徘徊?

编辑:Cplusplus vector erase() reference并不像juanchopanza所指出的那样清晰 . 这就是我最初使用erase()丢弃的原因 . 擦除后,效果很好 .

2 回答

  • 4

    使用 vector::erase . 它不会重新分配内存 .

    如果擦除的范围没有延伸到容器的末尾,它将重新定位结束元素 . 这意味着结束元素将在内存中的适当位置,这可能会导致数据复制 . 这与后备存储的重新分配不同 . 如果您的结束元素是 myVector.end() ,则不需要进行重定位 .

  • 3

    您可以使用成员函数 erase . 该矢量不会被重新分配,因为根据C标准,例如, C++17 n4659 standard draft 26.3.11.5 [vector.modifiers] "vector modifiers":

    迭代器擦除(const_iterator位置);
    iterator erase(const_iterator first,const_iterator last);
    3效果:在擦除点或之后使迭代器和引用无效 .

    引号的粗体部分表示不会重新分配向量 .

相关问题