forward_list
forward_list
forward_list 容器以单链表的形式存储元素。forward_list 的模板定义在头文件 forward_list 中。fdrward_list 和 list 最主要的区别是:它不能反向遍历元素;只能从头到尾遍历。
forward_list 的单向链接性也意味着它会有一些其他的特性:
- 无法使用反向迭代器。只能从它得到前向迭代器,这些迭代器都不能解引用,只能自增;
- 没有可以返回最后一个元素引用的成员函数
back()
;只有成员函数front()
; - 因为只能通过自增前面元素的迭代器来到达序列的终点,所以
push_back()
、pop_back()
、emplace_back()
也无法使用。
forward_list 容器的构造函数的使用方式和 list 容器相同。forward_list 的迭代器都是前向迭代器。它没有成员函数 size()
,因此不能用一个前向迭代器减去另一个前向迭代器,但是可以通过使用定义在头文件 iterator 中的 distance()
函数来得到元素的个数。
因为 forward_list 正向链接元素,所以只能在元素的后面插入或粘接另一个容器的元素,这一点和 list 容器的操作不同,list 可以在元素前进行操作。因为这个,forward_list 包含成员函数 splice_after()
和 insert_after()
,用来代替 list 容器的 splice()
和 insert()
;顾名思义,元素会被粘接或插入到 list 中的一个特定位置。当需要在 forward_list 的开始处粘接或插入元素时,这些操作仍然会有问题。除了第一个元素,不能将它们粘接或插入到任何其他元素之前。
这个问题可以通过使用成员函数 cbefore_begin()
和 before_begin()
来解决。它们分别可以返回指向第一个元素之前位置的 const 和 non-const 迭代器。所以可以使用它们在开始位置插入或粘接元素。
#include <string> #include <forward_list> using namespace std; int main() { forward_list<string> my_words{"three", "six", "eight"}; forward_list<string> your_words{"seven", "four", "nine"}; // 1.单个元素 // 将 your_words 的最后一个元素粘接到 my_words 的开始位置 // 第三个参数指向待转移元素之前的一个元素,只有后面的单个元素被转移。 my_words.splice_after(my_words.before_begin(), your_words, ++begin(your_words)); // my_words: nine three six eight // your_words: seven four // 2.一段元素 // 后两个参数 first 和 last,它包括 first 和 last 之间的所有元素,但不包括 first 和 last 元素本身 my_words.splice_after(my_words.before_begin(), your_words, begin(your_words), end(your_words)); // my_words: four nine three six eight // your_words: seven // 3.所有元素 my_words.splice_after(my_words.before_begin(), your_words); // my_words: seven four nine three six eight // your_words: }
forward_list 和 list —样都有成员函数 sort() 和 merge(),它们也都有 remove()、remove_if() 和unique(),所有这些函数的用法都和 list 相同。
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18370114
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步