有没有一种方法可以将已初始化的数据移动到 std::vector
中?
下面是我自己简单的 vec
类:
template<typename T>
class vec final
{
std::unique_ptr<T[]> pValues;
size_t size = 0;
public:
std::span<T> span() const { return std::span<int>(pValues.get(), size); }
vec(T* p, size_t sz) : size(sz) { pValues.reset(p); }
};
如您所见,它将接管传递给它的内存:
int main()
{
constexpr size_t count = 99;
auto orig = std::make_unique<int[]>(count);
{
std::span<int> orig_(orig.get(), count);
std::iota(orig_.begin(), orig_.end(), -1);
assert((orig_[0] == -1) && (orig_[1] == 0) && (orig_[98] == 97));
}
vec<int> nums(orig.release(), count);
auto nums_ = nums.span();
assert((nums_[0] == -1) && (nums_[1] == 0) && (nums_[98] == 97));
}
这一切都可以“按预期”运行,但我希望对std::vector
做类似的事情; 特别是,我不想将数据复制到std::vector
中(想象一下count
比99大得多)。
换句话说,我想要做的是像当我将一个std::vector
移动到另一个std::vector
时通常会发生的“指针复制”一样;但源是我的自有指针。正如我的示例代码所示,这是“容易”的,但我不想使用自己的vec
。
完成后,我想在std::vector
中进行“流量控制”,因为这样我就可以完全忘记内存管理(并且不必再扩展自己的vec
类)。使用std::vector
还可以很好地与现有的无法更改的C++代码配合使用。
std::vector
无法提供其底层数据指针的访问权限,因此很遗憾不能做到这一点 :-/ - Jarod42std::span
而不是std::vector
。 - Nolanstd::byte
不是int
,因此从一个向量移动数据到另一个向量是没有意义的。如果尝试这样做,您将违反别名规则。 - Kevin