我正在使用STL库,我的目标是尽量减少数据重新分配情况。 我wndering,确实std :: vector :: assign - 重新分配数据?
的std ::矢量::分配(size_type的N,const的VALUE_TYPE & VAL)
重新分配的数据,如果尺寸不改变或不被实际只分配新值(例如,使用operator =)?
的STL文件在http://www.cplusplus.com/最高审计机关以下(C++ 98):
在填充版(2),新内容是n个元素,每个初始化为val的副本。 如果发生重新分配,则使用内部分配器分配所需的存储空间。
在调用之前在容器中保留的任何元素被销毁并被新构造的元素替换(不发生元素赋值)。 如果 - 且仅当新矢量大小超过当前矢量容量,则会导致分配的存储空间自动重新分配。
短语“没有元素的分配”使这一切都有点混乱。因此,例如,我想要一个类的向量(例如,OpenCV的cv :: Vec3i)。这是否意味着,
- cv :: Vec3i的析构函数或构造函数将被调用?
- Vec3i内存的直接副本将制作并填充矢量?
- 如果我的类在运行时分配内存新的 运算符会发生什么?这个内存不能由普通内存 复制占。这是否意味着,assign()不应该用于这样的对象?
编辑:使用在这种情况下分配的整个目的是在载体中设置所有值设置为0(如果我已经标准::矢量< CV :: Vec3i> v)中。这将会做很多次。 std :: vector本身的大小不会改变。
我想要做的(在较短的办法)什么是以下几点:
for(int i=0; i<v.size(); i++)
for(int j=0; j<3; j++)
v[i][j] = 0;
现在我感兴趣的C++ 98
要最小化重新分配,请使用'std :: shared_ptr'。您可以自由地将这些指针从一个容器复制到另一个容器,只是指针本身被复制。使用“只读”对象的方法,它应该解决这个问题。 – Flovdis
它可能意味着“不分配元素......”是新元素是从参数复制构建的,并且没有复制分配发生。因此,如果你有一个明确的存储类型的复制ctor,那么你应该没有问题。 – bstamour
@Flovdis不共享Ctr 11的ptr部分?以为我们在这里讨论的是C++ 98 .. –