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

时间:2016-08-26 23:32:05

标签: c++ c++11 vector

我正在实现一种算法,需要我在循环的每次迭代中从向量中移除和添加相同的元素。

示例:

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

迭代2:| 1 3 | 2 4(大小2与元素' 2'和' 4'仍然存在于内存中,但未考虑向量的大小)

迭代3:| 1 2 3 | 4(大小3与元素' 4'仍在那里)

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

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:7)

您想要的内容与vector的工作方式在逻辑上不一致。 size返回Tvector类型的对象数。通过减小尺寸,任何从末端切断的物体都会被破坏。增加大小时,您将添加新对象

最好在 vector周围构建一个具有所需行为的类型。

答案 1 :(得分:3)

你做不到。

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

如果要跟踪正在使用的数组的元素数(例如,您使用的是带有五个元素的向量的两个元素),则创建一个额外的变量来跟踪它。为了说明(希望)明显,该变量需要与向量的大小保持一致(例如,以避免跟踪在具有五个元素的向量中使用十个元素)。

如果要将变量与向量保持一致,请同时使用struct / class类型的成员。该类可以提供管理向量和“使用中”元素数量的成员函数或操作,以确保一致性。

答案 2 :(得分:3)

我不知道,也许使用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.
};