reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。
resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。
再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:
vector<int> myVec;
myVec.reserve( 100 ); // 新元素还没有构造, 此时不能用[]访问元素
for (int i = 0; i < 100; i++ )
myVec.push_back( i ); //新元素这时才构造
myVec.resize( 102 ); // 用元素的默认构造函数构造了两个新的元素
myVec[100] = 1; //直接操作新元素
初次接触这两个接口也许会混淆,其实接口的命名就是对功能的绝佳描述,resize就是重新分配大小,reserve就是预留一定的空间。这两个接口即存在差别,也有共同点。下面就它们的细节进行分析。
为实现resize的语义,resize接口做了两个保证:
一是保证区间[0, new_size)范围内数据有效,如果下标index在此区间内,vector[indext]是合法的。
二是保证区间[0, new_size)范围以外数据无效,如果下标index在区间外,vector[indext]是非法的。
reserve只是保证vector的空间大小(capacity)最少达到它的参数所指定的大小n。在区间[0, n)范围内,如果下标是index,vector[index]这种访问有可能是合法的,也有可能是非法的,视具体情况而定。
resize和reserve接口的共同点是它们都保证了vector的空间大小(capacity)最少达到它的参数所指定的大小。
因两接口的源代码相当精简,以至于可以在这里贴上它们:
void resize(size_type new_size) { resize(new_size, T()); }
void resize(size_type new_size, const T& x) {
if (new_size < size())
erase(begin() + new_size, end()); // erase区间范围以外的数据,确保区间以外的数据无效
else
insert(end(), new_size - size(), x); // 填补区间范围内空缺的数据,确保区间内的数据有效
分享到:
相关推荐
5. 大小操作:`vector_size`返回向量中元素的数量,`vector_resize`可以改变向量的大小,可能涉及到元素的添加或删除。 6. 扩展与收缩:向量在插入元素后可能会进行扩展操作,确保有足够的空间容纳新元素。同样,当...
- `s.resize(n)`:调整`vector`大小,超出的部分会被删除,不足的部分会填充默认值。 - `s.resize(n, val)`:同上,不足的部分填充`val`的值。 - `s.clear()`:清空`vector`的所有元素。 - `s.swap(v)`:与`v`交换...
结合网上版本及c++ primer及visual sudio2017,ubuntu 16.04实测,实现标准库中vector的实现,缺少部分函数,包含了主要的push_back,resize,reserve,[],size()函数,若有疑问请发送至2268047160@qq.com,最近在详细...
对于`std::vector`的效率提升,有两个关键方法:`resize()`和`reserve()`。`resize()`方法用于改变`std::vector`的大小,它可以添加或删除元素以达到指定的大小。如果指定的大小大于当前大小,新元素会被默认初始化...
C++中的`std::vector`是一个模板类,用于表示动态数组。它提供了许多方便的成员函数,使得在处理数组时更加灵活高效。`std::vector`的使用涉及到以下几个主要方面: 1. **声明与初始化**: - `std::vector<T> vec;...
《MFC与C++中的Vector使用详解》 在C++编程中,MFC(Microsoft Foundation Classes)库提供了对Windows API的封装,使得开发者能够更方便地进行Windows应用程序开发。而在MFC中,C++标准库的容器之一——`std::...
**resize与reserve的区别**: - `resize()`:改变`vector`的大小。如果新大小小于当前大小,多余的元素会被销毁;如果新大小大于当前大小,新元素会被值初始化(对于基本类型如`int`通常是0,对于类类型会调用默认...
MFC、C++、Vector 使用标准库 Vector 是一个类模板,需要包含头文件 `#include <vector>`。下面是 Vector 的详细知识点: 定义和初始化 Vector<T> v1; // 默认构造函数 v1 为空 Vector<T> v2(v1); // v2 是 v1 的...
- **调整大小**:使用`resize`调整Vector的大小,如果新大小大于当前大小,则使用默认值或指定值填充剩余部分。 示例代码如下: ```cpp std::vector<int> v; v.reserve(10); // 预留空间 v.resize(5); // 调整大小...
3. 插入与删除:在vector的任意位置插入或删除元素,其效率取决于插入位置。在末尾插入(push_back)通常是最快的,而插入到中间或开头可能需要移动大量元素。 4. 容量管理:vector有一个实际大小(size)和一个...
18. swap():与另一个 Vector 交换数据。 在使用 Vector 时,需要注意的是,Vector 的预分配空间的做法可能会导致 iterator 无效的问题。这是因为 Vector 在增加节点时,会重新预留空间,导致以前已经分配单元的...
与传统的C风格数组相比,`vector`具有以下显著优势: - **动态调整大小**:可以根据需要自动扩展或收缩大小。 - **类型安全性**:由于是模板类,所以可以在编译时确定元素类型,从而避免运行时错误。 - **安全性**...
在C++编程中,自定义向量类(Vector)是一个常见的任务,它通常是为了实现与标准库中的`std::vector`类似的功能,但可以根据特定需求进行定制。以下是对标题和描述中涉及的关键知识点的详细解释: 1. **reserve()**:...
- **resize与reserve**: ```cpp v.resize(10); // 调整vector的大小为10 v.reserve(10); // 预先分配足够存储10个元素的内存 ``` 4. **特殊技巧** - **使用swap强制释放内存**: ```cpp std::vector<int> ...
- **拷贝构造**:创建一个与给定`vector``from`相同的`vector`。 - **迭代器构造**:根据指定的迭代器范围[start, end)创建`vector`,拷贝该范围内的元素。 ### 操作符 - **比较操作符**:`=`, `!=`, `, `>`, `, `...
【动态数组vector详解】 在C++编程中,`std::vector`是标准模板库(STL)中的一个重要容器,它提供了一种类似于动态数组的功能。vector不仅允许存储任意类型的元素,还可以根据需要自动调整其大小,这使得它在处理可...
5. 探究`vector`的复制构造和赋值操作,理解深拷贝和浅拷贝的区别。 通过这些练习,开发者可以深入理解`std::vector`的工作原理,提高编程技能,并在实际项目中更好地应用这一高效的数据结构。
`vector`的构造与初始化 `vector`可以在创建时被初始化,或者在后续的程序执行中动态添加元素。例如: ```cpp std::vector<int> vec1; // 默认构造,为空 std::vector<int> vec2(5, 0); // 初始化为5个0 std::...
13. `reserve()`函数可以改变当前vector所分配空间的大小。 14. `erase()`函数可以删除指针指向的数据项。 15. `clear()`函数可以清空当前的vector。 16. `rbegin()`函数可以将vector反转后的开始指针返回。 17. `...
* `resize`:改变当前 vector 的大小。 * `reserve`:改变当前 vector 的容量大小。 * `erase`:删除指定位置的元素。 * `clear`:清空 vector。 * `rbegin`:获取反转后的开始指针。 * `rend`:获取反转后的...