如何在不分配更多存储空间的情况下从数组初始化向量
How to initialize vector from array without allocating more storage space?
从数组初始化向量的直接方法似乎是:
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}初始化向量;或者,如果您不再需要数组,只需删除它,并将数组的引用推送到向量
相关文章:
- 是默认情况下分配给char数组常量的值
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 如何在没有硬编码的情况下以C++为单位获取类数组的长度?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 如何在不知道大小的情况下读取文本文件并存储到数组中
- 在不工作的情况下为数组分配指针,但反过来也可以
- 在不进行排序的情况下查找数组中n个最小值的索引
- 在这种情况下,数组a会被取消分配吗
- 在不复制数据的情况下,将double数组转换为只有double成员的structs数组
- 如何在不迭代的情况下对数组中的每个元素调用方法
- 在给定元素在螺旋上的位置的情况下,在二维数组中查找元素
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 在哪种情况下,C++会在编译时进行数组边界检查?
- 在这种情况下,删除指针数组期间会发生什么?
- 如何在不初始化每个元素的情况下为数组保留空间
- 在不指定大小的情况下分配数组
- 为什么两种情况下数组的大小都不相同
- 在不使用 hash_map的情况下对数组中的重复条目进行分组