我有以下情况:
T* get_somthing(){
std::vector<T> vec; //T is trivally-copyable
//fill vec
T* temp = new T[vec.size()];
memcpy(temp, vec.data(), vec.size() * sizeof(T));
return temp;
}
Run Code Online (Sandbox Code Playgroud)
我希望通过std::vector::data像这样直接返回来摆脱复制过程:
T* get_somthing(){
std::vector<T> vec; //T is trivally-copyable
//fill vec
return temp.data();
}
Run Code Online (Sandbox Code Playgroud)
但是,这是错误的,因为在vec调用析构函数时将删除数据.
那么,如何防止vec删除其数据呢?换句话说,我想从std::vectorC++原始动态数组中获得某种移动idiiom .
PS改变设计不是一种选择.使用std::vector这是强制性的.返回一个pointer到array也是必须的.Becauese它是两个模块之间的包装.一个需要矢量另一个需要指针.
"经典"STL容器例如std::vector并将std::map其分配器类型作为模板参数.这意味着,std::vector<T, std::allocator<T>>和std::vector<T, MyAllocator>例如被视为完全独立的类型.
一些较新的分配感知类,如std::shared_ptr和std::tuple,另一方面利用类型擦除约分配器"隐藏"的信息,所以它不会形成类型签名的一部分.但是,std::unordered_map(具有类似的年份shared_ptr)保持了采用额外默认模板参数的经典方法.
问题:
处理std::vector<T, std::allocator<T>>和std::vector<T, MyAllocator>作为不同类型被认为是可取的,还是只是在STL编写时类型擦除的副作用不是众所周知的技术?
以这种方式使用类型擦除有哪些缺点(如果有的话)?
类型擦除的分配器是否总是首选新容器?