相关疑难解决方法(0)

拒绝std :: vector删除其数据

我有以下情况:

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它是两个模块之间的包装.一个需要矢量另一个需要指针.

c++ vector c++11

16
推荐指数
3
解决办法
1347
查看次数

现代C++中的类型擦除分配器

"经典"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)保持了采用额外默认模板参数的经典方法.

问题:

  1. 处理std::vector<T, std::allocator<T>>和std::vector<T, MyAllocator>作为不同类型被认为是可取的,还是只是在STL编写时类型擦除的副作用不是众所周知的技术?

  2. 以这种方式使用类型擦除有哪些缺点(如果有的话)?

  3. 类型擦除的分配器是否总是首选新容器?

c++ stl type-erasure allocator c++11

8
推荐指数
1
解决办法
977
查看次数

标签 统计

c++ ×2

c++11 ×2

allocator ×1

stl ×1

type-erasure ×1

vector ×1