如何在不丢失现有数据的情况下调整std::vector的大小

How to resize an std::vector without loosing the existing data?

本文关键字:调整 情况下 std vector 数据      更新时间:2023-10-16

我正在实现一个算法,该算法需要我在每次循环迭代时从vector中删除和添加相同的元素。

的例子:

迭代1:|1 2 3 4| (size 4)

迭代2:|1 3| 2 4(大小为2,其中元素'2'和'4'仍在内存中,但未计入vector的大小)

迭代3:|1 2 3| 4(大小为3,元素'4'仍然存在)

基本上,我希望能够改变size()函数返回的值,而不会因为性能原因影响向量。

我知道可以在vector容器外使用另一个变量来跟踪vector的大小,但我想知道是否可以直接在std::vector容器内部实现。

谢谢你的帮助

您想要的在逻辑上与vector的工作方式不一致。size返回vector中类型为T的对象的个数。通过减小这个尺寸,任何从末端切下来的物体都被破坏了。当您增加大小时,您将添加新对象

最好在 vector周围建立一个类型,它具有您想要的行为。

你不能那样做。

减少size()报告的值的唯一方法是调整大小。当调整大小减少大小时,对于程序而言,新大小之外的元素将不再存在。任何访问它们的方法(或重新访问它们,在您的情况下)都会产生未定义的行为。

如果您想要跟踪正在使用的数组的元素数量(例如,您正在使用具有五个元素的向量的两个元素),那么创建一个额外的变量来跟踪它。很明显,该变量需要与vector的大小保持一致(例如,避免跟踪到有5个元素的vector使用了10个元素)。

如果你想让变量和vector同时存在,让两个成员都是struct/class类型。该类可以提供成员函数或操作来同时管理vector和"正在使用"的元素数量,以确保一致性。

我不知道,也许用has-a代替is-a ?

template <typename T> class subvector {
protected:
  std::vector<T> owner_;
  std::size_t    begin_;
  std::size_t    end_;
public:
  subvector(std::vector<T>& owner, size_t from, size_t to) :
    owner_(owner), begin_(from), end_(to)
  {
     // do some range checks
  }
  size_t size() const {
    // range check before return
    // either throw (fast-fail) *or* 
    //   adjust the out-of-range ends (lenient but maybe unsafe)
    return end_-begin_+1;
  }
  // implement as many of the std::vector methods/operators
  // you are likely to need in your code by delegation
  // to the owner_.
  // Stay minimal, whenever you use something you don't have, 
  // the compiler will tell you.
}; 
相关文章: