Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ <;向量>;推回实现内部_C++_Vector_Data Structures_Stl_Push Back - Fatal编程技术网

C++ <;向量>;推回实现内部

C++ <;向量>;推回实现内部,c++,vector,data-structures,stl,push-back,C++,Vector,Data Structures,Stl,Push Back,在std::vectors push_-back实现中,当size()=capacity()时,它分配两倍多的位置并复制旧的元素,我想问,复制的最有效方式是什么?听起来有点像是你想自己实现std::vector。 最有效的方法是首先避免重新分配,这通常是可能的,但并不总是可能的 如果您事先知道下一步将推送多少项,那么可以使用std::vector::reserve(),避免重新分配 如果您真的要自己实现,您可能希望使用realloc(),尽管这是一个可怕的函数,它可以做什么取决于参数值,从mal

在std::vectors push_-back实现中,当size()=capacity()时,它分配两倍多的位置并复制旧的元素,我想问,复制的最有效方式是什么?

听起来有点像是你想自己实现
std::vector

最有效的方法是首先避免重新分配,这通常是可能的,但并不总是可能的

如果您事先知道下一步将推送多少项,那么可以使用
std::vector::reserve()
,避免重新分配

如果您真的要自己实现,您可能希望使用
realloc()
,尽管这是一个可怕的函数,它可以做什么取决于参数值,从
malloc()
free()
realloc()

这个函数之所以有用,是因为堆上的数据块后面很可能还有空间
realloc()
是唯一一个可以通过扩展此堆块大小避免100%时间移动数据的函数,如果有足够的空间,则根本不接触数据


使用
realloc()
的缺点是,您的“特殊性能”实现将放弃分配器的概念,并且无法处理需要复制构造函数调用等的元素类型。因此,您最好不要将向量命名为“SimpleDataVector”并可能内置一些机制来检测误用。

听起来有点像是您想自己实现
std::vector

最有效的方法是首先避免重新分配,这通常是可能的,但并不总是可能的

如果您事先知道下一步将推送多少项,那么可以使用
std::vector::reserve()
,避免重新分配

如果您真的要自己实现,您可能希望使用
realloc()
,尽管这是一个可怕的函数,它可以做什么取决于参数值,从
malloc()
free()
realloc()

这个函数之所以有用,是因为堆上的数据块后面很可能还有空间
realloc()
是唯一一个可以通过扩展此堆块大小避免100%时间移动数据的函数,如果有足够的空间,则根本不接触数据


使用
realloc()
的缺点是,您的“特殊性能”实现将放弃分配器的概念,并且无法处理需要复制构造函数调用等的元素类型。因此,您最好不要将向量命名为“SimpleDataVector”并可能内置一些机制来检测误用。

标准中并未真正规定这一点,但留给实现。因此,不同的C++库版本会有不同的做法。但是,任何分配和取消分配都必须使用
向量的
分配器

(因此不使用
realloc()

不过,该标准规定,如果可以移动(而不是复制)对象,则应该移动它们(从C++11开始)。通常,将分配一个新的原始内存块(通常是前一个的两倍),然后将元素从前一个移动(或复制并销毁)到旧的。对于一般情况,必须逐个进行移动/复制(否则,如果不了解各个移动/复制构造函数的内部结构,则无法保证移动/复制的完整性)。当然,对于pod(=普通旧数据)类型,可以通过
std::memcpy()
进行优化(并且最有可能实现)


你可以尝试查看C++库实现,但是要警告那些不熟悉元模板编程的代码是非常不透明的:代码复杂,因为各种优化(POD、可移动类型等)。

< P>这在标准中没有真正指定,但留给实现。因此,不同的C++库版本会有不同的做法。但是,任何分配和取消分配都必须使用
向量的
分配器

(因此不使用
realloc()

不过,该标准规定,如果可以移动(而不是复制)对象,则应该移动它们(从C++11开始)。通常,将分配一个新的原始内存块(通常是前一个的两倍),然后将元素从前一个移动(或复制并销毁)到旧的。对于一般情况,必须逐个进行移动/复制(否则,如果不了解各个移动/复制构造函数的内部结构,则无法保证移动/复制的完整性)。当然,对于pod(=普通旧数据)类型,可以通过
std::memcpy()
进行优化(并且最有可能实现)


<>你可以尝试查看C++库实现,但是要警告那些不熟悉元模板编程的代码是非常不透明的:代码复杂,因为各种优化(POD、可移动类型等)。你是在问vector如何复制旧元素,你想做什么?我不想做同样的事情,我想知道vector是如何做到的?然后简单地找到头文件,看看它是如何做到的?我的回答给出了如何“最有效地”做到这一点的选项。它没有描述std::vector实现最有可能的功能。请您把问题说清楚一点好吗?你是在问向量如何复制旧的元素,你想做同样的事情,还是什么?我不想做