C++中std::resize(n)和std::shrink_to_fit之间的区别
Difference between std::resize(n) and std::shrink_to_fit in C++?
我发现了以下语句:
resize(n)
–调整容器的大小,使其包含"n"个元素shrink_to_fit()
–减少容器的容量以适应其大小,并销毁超出容量的所有元素。
这些功能之间有什么显著的区别吗?它们属于c++中的矢量
矢量有两个"长度"属性,表示不同的东西:
size
是向量中可用元素的数量。它是你存储的东西的数量。这是一个概念长度capacity
是向量当前分配的内存量中适合多少元素
capacity >= size
必须始终为真,但没有理由使它们始终相等。例如,当您删除一个元素时,缩小分配将需要创建一个小一个bucket的新分配,并将剩余内容移到上面("allocate,move,free"(。
类似地,如果capacity == size
和您添加一个元素,向量可以将分配增加一个元素(另一个"分配、移动、释放"操作(,但通常您要添加多个元素。如果容量需要增加,向量的容量将增加,而不是一个元素,这样您就可以在需要再次移动所有元素之前再添加几个元素。
有了这些知识,我们可以回答您的问题:
std::vector<T>::resize()
更改数组的大小。如果将其大小调整为小于当前大小,则多余的对象将被销毁。如果将其大小调整为大于当前大小,则在末尾添加的"新"对象将默认初始化std::vector<T>::shrink_to_fit()
要求更改容量以匹配当前大小。(实现可能,也可能不接受此请求。它们可能会降低容量,但不会使其等于大小。它们可能根本不做任何事情。(如果请求得到满足,这将丢弃矢量分配中未使用的部分或全部。当你构建完一个向量,并且永远不会向其中添加另一个项目时,你通常会使用这个方法。(如果你提前知道要添加多少个项目,那么在添加任何项目之前,最好使用std::vector<T>::reserve()
来告诉向量,而不是依赖shrink_to_fit
来做任何事情。(
所以您使用resize()
来改变向量中概念上有多少东西
您可以使用shrink_to_fit()
来最小化向量内部分配的多余空间,而不必在概念上改变向量中的内容数量。
shrink_to_fit()
–减少容器的容量以适应其大小,并销毁超出容量的所有元素。
这是对所发生事情的错误描述。从本质上讲,销毁所有超出容量的元素部分并不准确。
在C++中,当动态内存用于对象时,有两个步骤:
- 内存是为对象分配的
- 对象在内存位置进行初始化/构造
当动态分配内存中的对象被删除时,还有两个步骤,它们反映了构建的步骤,但顺序相反:
- 内存位置的对象被破坏(对于内置类型,这是一个noop(
- 对象使用的内存被释放
超过容器的大小分配的内存只是缓冲区。它们没有保存任何正确初始化的对象。这只是原始记忆。shrink_to_fit()
确保没有额外的内存,但在这些位置没有对象。因此,没有任何东西被破坏,只有内存被释放。
根据与shrink_to_fit
相关的C++标准
效果:shrink_to_fit是一个减少容量的非绑定请求((到size((。
并且相对于resize
效果:如果sz<size((,从序列否则,将sz-size((默认插入的元素附加到序列。
很明显,函数做的事情不同。此外,第一函数没有参数,而第二函数甚至有两个参数。函数shrink_to_fit
不会改变容器的大小,但可以重新分配内存。
- std::bind to void* to std::function
- std::time_point from and to std::string
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- Port pthread_cond_broadcast to std::atomic
- from std::vector to adept::avector
- File to std::string_view
- 如何修复以下错误"no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
- std::map to std::list leads to SIGSEGV
- std::bind to a std::variant 包含多个 std::函数类型
- NSMutableArray to std::vector
- 将 2D 数组插入 std::vector 时"cannot convert from 'const GLfloat [12]' to '_Objty'"错误消息
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错
- 返回"Cannot convert from 'std::ofstream {aka std::basic_ofstream<char>}' to bool"错误
- reinterpret_cast std::function* to and from void*
- std::string to std::regex
- 使用命名空间 std 时C++ "Reference to overloaded function"错误
- Copy std::vector to boost::interprocess::vector
- BOOST :: lexical_cast to std ::字符串失败
- C++ std::vector to JSON Array with rapidjson
- 最快的方式 std::vector<Derived> to std::vector<Base>