如何在不分配更多存储空间的情况下从数组初始化向量

How to initialize vector from array without allocating more storage space?

本文关键字:情况下 数组 向量 初始化 存储空间 分配      更新时间:2023-10-16

从数组初始化向量的直接方法似乎是:

int sizeArr; int * array = getArray(sizeArr);
std::vector<int> vec(array, array+sizeArr);

在这里,我从一个函数中获取数组,该函数分配内存中的空间并通过引用设置sizeArr。{start-edit}不幸的是,这个函数不是我写的,我需要处理C风格的数组,然后以某种方式将其转换为向量。(如果可能有效)。{结束编辑}

当我初始化vec时,显然我是在为它单独分配空间。如果我无意再使用array的数据,是否可以以某种方式将array指向的数据"移动"到向量vec,而不为其单独分配任何空间?

如果调用者不拥有数据(即不负责删除数据),那么最简单的选择可能是编写一个类似容器的包装器:

template <typename T>
struct array_wrapper
{
  typedef T* iterator;
  typedef const T* const_iterator;
  array_wrapper(T* begin, T* end) : data_(begin), size_(end-begin) {}
  iterator begin() { return data_; }
  iterator end() { return data_ + size_; }
  const_iterator begin() const { return data_; }
  const_iterator end() const { return data_ + size_; }
  size_t size() const { return size_; }
  T& operator[](size_t i) { return _data[i]; }
  const T& operator[](size_t i) const { return _data[i]; }
  void swap(array_wrapper& other) { 
    std::swap(size_, other.size_);
    std::swap(data_, other.data_);
  }
 private:
  T* data_;
  size_t size_;
};

然后

array_wrapper<int> vec(array, array+sizeArr);

它具有std::vector的许多功能,但不拥有底层数据,并且不支持会导致调整大小或重新分配的操作。

为什么还要为内存分配一个int指针?很有可能,你没有理由这么做。

如果你有一个帮助c++11的编译器,那么应该可以用std::vectorvec{array}初始化向量;或者,如果您不再需要数组,只需删除它,并将数组的引用推送到向量