list 的初始化和遍历
/*list的初始化和遍历*/
#if 1
#include <list>
#include <vector>
#include <iostream>
#include<algorithm>
using namespace std;
void TestList1()
{
list<int> L1;
list<int> L2(10, 5);
vector<int> v{1,2,3,4,5};
list<int> L3(v.begin(), v.end());
list<int> L4(L3);
// C++11
list<int> L5{ 1, 2, 3, 4, 5 };
/////////////////////////////////////////
// 链表遍历
for (auto e : L2)
cout << e << " ";
cout << endl;
// list<int>::iterator it = L3.begin();
auto it = L3.begin();
while (it != L3.end())
{
cout << *it << " ";
++it;
}
cout << endl;
auto rit = L4.rbegin();
while (rit != L4.rend())
{
cout << *rit << " ";
++rit;
}
cout << endl;
// 注意:list不能使用原生态指针,即Node*来遍历链表
// 因为list没有提供获取头指针的方法
}
int main(){
TestList1();
}
#endif
std::list
是一个双向链表,提供了双向序列的特性,包括有效地进行插入、删除操作等,但不支持随机访问。
初始化 std::list
空初始化: list<int> L1;
创建了一个空的 int
类型的 list
。
填充初始化: list<int> L2(10, 5);
创建了一个包含 10 个元素,每个元素都初始化为 5 的 list
。
范围初始化: list<int> L3(v.begin(), v.end());
使用 vector<int> v
的迭代器范围来初始化 L3
,即将 v
中的元素复制到 L3
中。
拷贝初始化: list<int> L4(L3);
使用另一个 list
L3
来初始化 L4
,复制 L3
的所有元素。
列表初始化 (C++11): list<int> L5{ 1, 2, 3, 4, 5 };
使用初始化列表直接初始化 L5
。
链表遍历
范围 for
循环: 使用范围 for
循环遍历 L2
,打印出其所有元素。这是 C++11 引入的一种简洁的遍历容器的方式。
使用迭代器: 通过迭代器 it
遍历 L3
,同样打印出所有元素。std::list
提供的迭代器是双向迭代器。
使用反向迭代器: 通过反向迭代器 rit
遍历 L4
,但这次是逆序打印出所有元素。反向迭代器从容器的末尾开始遍历至开始。
注意
代码中提到,“list
不能使用原生态指针,即 Node*
来遍历链表”,这是因为 std::list
的实现细节被抽象化了,用户无法像操作普通链表那样通过节点指针进行遍历或访问。std::list
提供了迭代器来抽象这些细节,使得操作更安全、更容易。
list 的 resize 操作探究
/*list的resize操作探究*/
#if 1
#include <list>
#include <vector>
#include <iostream>
#include<algorithm>
using namespace std;
void TestList2()
{
list<int> L{ 1, 2, 3, 4, 5 };
cout << L.size() << endl;
L.resize(10, 6);
for (auto e : L)
cout << e << " ";
cout << endl;
L.resize(20);
for (auto e : L)
cout << e << " ";
cout << endl;
L.resize(7);
for (auto e : L)
cout << e << " ";
cout << endl;
}
int main(){
TestList2();
}
#endif
resize
方法用于调整链表的大小,即元素的数量。以下是对 TestList2
函数中各个操作的详细解释:
初始化 std::list
list<int> L{ 1, 2, 3, 4, 5 };
使用初始化列表创建了一个包含元素 {1, 2, 3, 4, 5}
的 list
。
调整大小并填充新元素
L.resize(10, 6);
调整 L
的大小至 10 个元素。由于新大小大于当前大小,resize
方法会添加额外的元素。在这个例子中,新增的元素被初始化为 6