C++ 容器类 <list> | 菜鸟教程 (2025)

C++ 容器类 <vector>

C++ 容器类 <deque>

C++ 标准库提供了丰富的功能,其中 <list> 是一个非常重要的容器类,用于存储元素集合,支持双向迭代器。

<list> 是 C++ 标准模板库(STL)中的一个序列容器,它允许在容器的任意位置快速插入和删除元素。与数组或向量(<vector>)不同,<list> 不需要在创建时指定大小,并且可以在任何位置添加或删除元素,而不需要重新分配内存。

语法

以下是 <list> 容器的一些基本操作:

  • 包含头文件:#include <list>
  • 声明列表:std::list<T> mylist;,其中 T 是存储在列表中的元素类型。
  • 插入元素:mylist.push_back(value);
  • 删除元素:mylist.pop_back();mylist.erase(iterator);
  • 访问元素:mylist.front();mylist.back();
  • 遍历列表:使用迭代器 for (auto it = mylist.begin(); it != mylist.end(); ++it)

特点

  • 双向迭代<list> 提供了双向迭代器,可以向前和向后遍历元素。
  • 动态大小:与数组不同,<list> 的大小可以动态变化,不需要预先分配固定大小的内存。
  • 快速插入和删除:可以在列表的任何位置快速插入或删除元素,而不需要像向量那样移动大量元素。

声明与初始化

<list> 的声明和初始化与其他容器类似:

#include <iostream>#include <list>int main() { std::list<int> lst1; // 空的list std::list<int> lst2(5); // 包含5个默认初始化元素的list std::list<int> lst3(5, 10); // 包含5个元素,每个元素为10 std::list<int> lst4 = {1, 2, 3, 4}; // 使用初始化列表 return 0;}

实例

下面是一个使用 <list> 的简单示例,包括创建列表、添加元素、遍历列表和输出结果。

实例

#include <iostream>
#include <list>

int main() {
// 创建一个整数类型的列表
std::list<int> numbers;

// 向列表中添加元素
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);

// 访问并打印列表的第一个元素
std::cout << "First element: " << numbers.front() << std::endl;

// 访问并打印列表的最后一个元素
std::cout << "Last element: " << numbers.back() << std::endl;

// 遍历列表并打印所有元素
std::cout << "List elements: ";
for (std::list<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;

// 删除列表中的最后一个元素
numbers.pop_back();

// 再次遍历列表并打印所有元素
std::cout << "List elements after removing the last element: ";
for (std::list<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;

return 0;
}

输出结果:

First element: 10Last element: 30List elements: 10 20 30 List elements after removing the last element: 10 20

常用成员函数

以下是 <list> 中一些常用的成员函数:

函数说明
push_back(const T& val)在链表末尾添加元素
push_front(const T& val)在链表头部添加元素
pop_back()删除链表末尾的元素
pop_front()删除链表头部的元素
insert(iterator pos, val)在指定位置插入元素
erase(iterator pos)删除指定位置的元素
clear()清空所有元素
size()返回链表中的元素数量
empty()检查链表是否为空
front()返回链表第一个元素
back()返回链表最后一个元素
remove(const T& val)删除所有等于指定值的元素
sort()对链表中的元素进行排序
merge(list& other)合并另一个已排序的链表
reverse()反转链表
begin() / end()返回链表的起始/结束迭代器

实例

1、基本操作

实例

#include <iostream>
#include <list>

int main() {
std::list<int> lst = {10, 20, 30};

// 插入和删除元素
lst.push_front(5); // 在头部插入5
lst.push_back(40); // 在尾部插入40
lst.pop_front(); // 删除头部元素
lst.pop_back(); // 删除尾部元素

// 输出链表内容
std::cout << "List elements: ";
for (const auto& elem : lst) {
std::cout << elem << " ";
}
std::cout << std::endl;

return 0;
}

2、插入和删除特定位置的元素

实例

#include <iostream>
#include <list>

int main() {
std::list<int> lst = {1, 2, 3, 4, 5};
auto it = lst.begin();
std::advance(it, 2); // 移动迭代器到第3个元素(值为3)

lst.insert(it, 10); // 在第3个元素前插入10
lst.erase(it); // 删除第3个元素

// 输出链表内容
std::cout << "List elements: ";
for (const auto& elem : lst) {
std::cout << elem << " ";
}
std::cout << std::endl;

return 0;
}

3、排序和去重

实例

#include <iostream>
#include <list>

int main() {
std::list<int> lst = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
lst.sort(); // 排序
lst.unique(); // 删除相邻重复元素

// 输出链表内容
std::cout << "Sorted and unique list: ";
for (const auto& elem : lst) {
std::cout << elem << " ";
}
std::cout << std::endl;

return 0;
}

4、合并和反转

实例

#include <iostream>
#include <list>

int main() {
std::list<int> lst1 = {1, 3, 5, 7};
std::list<int> lst2 = {2, 4, 6, 8};

lst1.merge(lst2); // 合并两个已排序的链表
lst1.reverse(); // 反转链表

// 输出链表内容
std::cout << "Merged and reversed list: ";
for (const auto& elem : lst1) {
std::cout << elem << " ";
}
std::cout << std::endl;

return 0;
}

与其他容器对比

特性std::liststd::vectorstd::deque
内存结构非连续内存,双向链表连续内存分段连续内存
访问性能顺序访问较快,随机访问慢随机访问快末尾和头部访问都快
插入/删除性能任意位置插入、删除快末尾插入快,中间位置慢头尾插入、删除快
适用场景频繁在中间插入/删除需要高效随机访问需要在头尾快速插入/删除
迭代器稳定性稳定,元素插入或删除不会失效插入、删除可能导致迭代器失效插入、删除可能导致迭代器失效

注意事项

  • <list> 的元素是按插入顺序存储的,而不是按元素值排序。
  • 由于 <list> 的元素存储在不同的内存位置,所以它不适合需要随机访问的场景。
  • 与向量相比,<list> 的内存使用效率较低,因为每个元素都需要额外的空间来存储指向前后元素的指针。

通过这个简单的介绍和示例,初学者应该能够对 C++ 的 <list> 容器有一个基本的了解,并能够开始使用它来解决实际问题。

C++ 容器类 <vector>

C++ 容器类 <deque>

');var statusdiv=$('#comment-status');commentform.submit(function(e){e.preventDefault();var noteContent = editor.getValue();// console.log(noteContent);noteContent = noteContent.replace(/

/g,"
");noteContent = noteContent.replace(/<\/code><\/pre>/g,"
");// 系列化表单数据var comment_parent = 0;var is_user_logged_in = $("#is_user_logged_in").val();var comment_post_ID = 25627;var _wp_unfiltered_html_comment = $("#_wp_unfiltered_html_comment").val();var comment = noteContent;var author = $("#author").val();var url = $("#url").val();var email = $("#email").val();if(isBlank(author) && is_user_logged_in==0) {statusdiv.html('

请输入昵称!

').show();} else if(isBlank(email) && is_user_logged_in==0) {statusdiv.html('

请输入邮箱!

').show();} else {// var formdata=commentform.serialize() + "&comment=" + noteContent ;// 添加状态信息statusdiv.html('

Processing...

').show();// 获取表单提交地址var formurl=commentform.attr('action');// 异步提交$.ajax({type: 'post',url: formurl,dataType:'json',data: {"comment_parent":comment_parent,"comment_post_ID":comment_post_ID, "_wp_unfiltered_html_comment":_wp_unfiltered_html_comment,"comment":comment,"url":url, "email":email,"author":author},error: function(XMLHttpRequest, textStatus, errorThrown){statusdiv.html('

数据不完整或表单提交太快了!

').show();},success: function(data, textStatus){if(data.errorno=="0") {$("#submit").prop('disabled', true);statusdiv.html('

笔记已提交审核,感谢分享笔记!

').show();alert('笔记已提交审核,感谢分享笔记!');}else{statusdiv.html('

'+data.msg+'

').show();}commentform.find('textarea[name=comment]').val('');}});setTimeout(function(){ $("#submit").prop('disabled', false); }, 10*1000);}return false;});$(".comt-author").click(function() {href = $(this).children("a").attr("href");if(href.indexOf("/note/")!=-1) {var win = window.open(href, '_blank'); win.focus();}});$(".comt-meta span").hover(function(){$(this).children(".tooltip").css({ "opacity": 1, "pointer-events": "auto"});},function(){$(this).children(".tooltip").removeAttr("style");});/*$(".wrapper i").hover(function(){$(this).siblings(".tooltip").css({ "opacity": 1, "pointer-events": "auto"});},function(){$(this).siblings(".tooltip").css({ "opacity": 0, "pointer-events": "auto"});});*///Upvote.create('runoobvote-id', {callback: vote_callback});var ajaxurl = 'https://www.runoob.com/wp-admin/admin-ajax.php';var callback = function(data) {//console.log($('#runoobvote-id').upvote('upvoted'));//console.log($('#runoobvote-id').upvote('downvoted'));//console.log(data);_vote_action = data.action;id_arr = data.id.split('-');um_id= id_arr[2];//console.log(um_id);var re = /^[1-9]+/;if (re.test(um_id)) { var ajax_data = {_vote_action: _vote_action,action: "pinglun_zan",um_id: um_id,um_action: "ding"};//console.log(ajax_data);$.post(ajaxurl,ajax_data,function(status){//if(status.vote_num>999) {//_voteHtml = ''+kFormatter(status.vote_num) +'';//$("#runoobvote-id-" + um_id + " .count").hide().after(_voteHtml);//}});}};if($('#comments').length && $('.upvotejs').length){$('.upvotejs').upvote({id: 25627, callback: callback});$.post(ajaxurl,{"action":"pinglun_zan","postid":25627},function(data){ $(data).each(function(key,value) {$("#runoobvote-id-" + value.commid + " .upvote").addClass(value.upvotejs_class);$("#runoobvote-id-" + value.commid + " .downvote").addClass(value.downvote_class);$("#runoobvote-id-" + value.commid + " .count").text(value.upvote_count);})},'json');}});function isBlank(str) { return (!str || /^\s*$/.test(str));}function kFormatter(num) {// return num; return Math.abs(num) > 999 ? Math.sign(num)*((Math.abs(num)/1000).toFixed(1)) + 'k' : Math.sign(num)*Math.abs(num)}
C++ 容器类 <list> | 菜鸟教程 (2025)

References

Top Articles
Latest Posts
Recommended Articles
Article information

Author: Rueben Jacobs

Last Updated:

Views: 5925

Rating: 4.7 / 5 (77 voted)

Reviews: 92% of readers found this page helpful

Author information

Name: Rueben Jacobs

Birthday: 1999-03-14

Address: 951 Caterina Walk, Schambergerside, CA 67667-0896

Phone: +6881806848632

Job: Internal Education Planner

Hobby: Candle making, Cabaret, Poi, Gambling, Rock climbing, Wood carving, Computer programming

Introduction: My name is Rueben Jacobs, I am a cooperative, beautiful, kind, comfortable, glamorous, open, magnificent person who loves writing and wants to share my knowledge and understanding with you.