C++ STL中的forward_list resize()函数
在C++ STL(标准模板库)中,forward_list
是一种单向链表容器,它允许在链表前端(头部)进行高效的插入和删除操作。resize()
函数是forward_list
容器中的一个成员函数,用于改变容器的大小。本文将介绍resize()
函数的用法及示例代码,并对其实现原理进行解析。
使用方法
forward_list
容器的resize()
函数有两种形式:
void resize (size_type n);
void resize (size_type n, const value_type& val = value_type());
两种形式都用于改变forward_list
容器的大小,区别在于第二个参数。第二个参数val
在第一种形式中没有默认参数,需要手动指定,而在第二种形式中已经默认为了容器的元素类型value_type
。如果新的大小比当前大小小,则从链表末尾删除节点或销毁元素;如果新的大小比当前大小大,则向链表末尾添加元素,实现的机制是拷贝或移动当前最后一个元素,或使用默认构造函数创建一个新元素,多出来的元素以默认值val
填充。
示例代码
下面的示例代码分别演示了两个形式的resize()
函数的用法和效果:
#include <iostream>
#include <forward_list>
using namespace std;
int main() {
forward_list<int> mylist = {1, 2, 3, 4, 5};
// 将 forward_list 容器 resize 到更小的 size
mylist.resize(3);
cout << "mylist contains:";
for (auto it = mylist.begin(); it != mylist.end(); ++it)
cout << ' ' << *it;
cout << '\n';
// 将 forward_list 容器 resize 到更大的 size
mylist.resize(5, 100);
cout << "mylist contains:";
for (auto it = mylist.begin(); it != mylist.end(); ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}
上述代码的输出结果为:
mylist contains: 1 2 3
mylist contains: 1 2 3 100 100
实现原理
forward_list
容器没有提供随机访问的功能,只能使用迭代器依次遍历容器的节点。因此,resize()
函数的实现方式也不能简单地像vector
和deque
一样进行元素复制和移动,而是需要遍历容器。具体来说,resize()
函数的实现原理如下:
- 如果新的大小比当前大小小,则从链表末尾删除节点或销毁元素,并修改指针指向和容器大小;
- 如果新的大小比当前大小大,则首先遍历到链表末尾,然后判断该元素是否已经存在:
- 如果该元素已经存在,则什么也不做;
- 如果该元素不存在,则使用默认构造函数创建该元素,并添加到链表末尾。
- 如果新的大小与当前大小相等,则什么也不做。
总之,resize()
函数的实现方式是线性遍历链表,在链表末尾进行元素添加或删除操作。由于这种方式不需要进行大量的元素复制和移动,因此forward_list
容器的resize()
函数可以高效地在头部添加或删除元素。
结论
本文介绍了forward_list
容器中的resize()
函数的用法及示例代码,并对其实现原理进行了解析。对于forward_list
容器来说,resize()
函数的实现方式具有高效性,可用于实现在链表头部进行元素添加或删除的操作。如果需要对容器进行大小的改变,可以使用resize()
函数,根据需要指定新的大小和默认值。在实现上,forward_list
容器的resize()
函数需要遍历整个链表,在链表末尾进行元素添加或删除,因此效率相对较高。同时,由于forward_list
容器没有提供随机访问的功能,因此无法像vector
和deque
一样直接进行元素复制和移动。在使用resize()
函数时,需要注意空间的分配和释放,避免出现内存泄漏问题。