gpt4 book ai didi

c++ - 在具有不同分配器的 vector 之间进行转换

转载 作者:可可西里 更新时间:2023-11-01 16:29:57 25 4
gpt4 key购买 nike

我已经编写了一个简单的 C++11 风格的有状态分配器类型。给定

template<typename T> class my_allocator {
// the usual stuff
};

template<typename T> using my_vector = std::vector<T, my_allocator<T>>;

my_vector<int> x;

std::vector<int> y = x; // error

允许从 my_vector 进行转换的最佳方法是什么?到 std::vector使用默认分配器? GCC 4.7(最近的 svn)说

error: conversion from 'my_vector<int> {aka std::vector<int, my_allocator<int>>}' to non-scalar type 'std::vector<int>' requested

显然这可以通过一个简单的转换函数来完成,例如

template<typename T> std::vector<T> to_std_vec(const my_vector<T>& v)  {
return std::vector<T>(&v[0], &v[v.size()]);
}

但这看起来很不优雅。在 C++11 中有更好的解决方案吗?

当然,移动语义在这种情况下是正确的,但我希望复制构造和赋值能够在没有额外噪声/输入的情况下工作。

最佳答案

您不可能希望绕过明显的拷贝:std::vector<int> y(x.begin(), x.end(); . y 中的元素将由 std::allocator 分配,而 x 中的元素由您自己的分配器分配,并将被销毁。这两个分配器可能有完全不相关的内存指针 概念!没有理由认为一个分配器使用的内存存储与另一个分配器使用的内存有任何关系。

除了制作语义元素拷贝,您还能做什么?

如果您不再需要旧容器,您应该移动,不过:

std::vector<int> y(std::make_move_iterator(x.begin()),
std::make_move_iterator(x.end()));

(如果 元素 有自己的同意的分配器,这将有所帮助。当然不适用于 int。)

更新:为了强调这一点,请注意 vector<T, Alloc> 的内部数据缓冲区不是 T* 类型, 而不是 Alloc::pointer 类型.没有理由认为这些是两个不同分配器的相关类型。

关于c++ - 在具有不同分配器的 vector 之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8190889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com