c++ list遍历
时间: 2024-09-05 08:00:53 浏览: 40
在 C++ 中,`list` 是一种双向链表数据结构,它允许元素在插入或删除时保持高效的操作性能。遍历 `list` 的常见操作有前向遍历和反向遍历。
1. **前向遍历**:
使用迭代器进行前向遍历,你可以创建一个 `list` 的迭代器,并通过 `next()` 或 `++` 运算符逐个访问元素。示例代码如下:
```cpp
std::list<int> myList = {1, 2, 3, 4, 5};
for (auto it = myList.begin(); it != myList.end(); ++it) {
std::cout << *it << " ";
}
```
这里,`begin()` 返回列表的第一个元素迭代器,`end()` 返回到列表结束位置的一个过去值迭代器,它们之间的迭代器可以依次访问所有元素。
2. **反向遍历**:
可以通过 `rbegin()` 和 `rend()` 函数从后向前遍历,示例如下:
```cpp
for (auto it = myList.rbegin(); it != myList.rend(); ++it) {
std::cout << *it << " ";
}
```
相关问题
c++ 循环遍历 list
在C++中,`std::list`是一种双链表数据结构,它允许高效地插入、删除元素,并且从头部和尾部访问元素速度很快。为了循环遍历`std::list`,可以使用迭代器(iterator),这使得遍历非常简单。
### 使用标准库迭代器遍历
通常我们会创建一个`std::list<T>`容器,然后通过迭代器遍历其中的每个元素。下面是一个具体的例子:
```cpp
#include <iostream>
#include <list>
using namespace std;
int main() {
// 初始化列表
list<int> my_list = {10, 20, 30, 40, 50};
// 使用反向迭代器从末尾开始遍历
for (auto it = my_list.rbegin(); it != my_list.rend(); ++it) {
cout << *it << " "; // 输出每个元素
}
return 0;
}
```
在这个例子中,我们首先包含了必要的头文件并声明了一个包含整数的`std::list`容器。然后我们使用反向迭代器(`rbegin()` 和 `rend()` 函数分别获取列表的第一个和最后一个元素的位置)从末尾开始遍历整个列表,并打印出每个元素的值。
### 自定义迭代器遍历
除了使用标准库提供的迭代器外,也可以自定义迭代器来遍历`std::list`。但是这种方法相对复杂,因为需要实现迭代器的基本操作(如`operator*`用于访问当前元素,`operator->`对于指针迭代器),以及迭代器的移动操作(例如,将迭代器向前或向后移动)。以下是自定义迭代器的一个简化的示例:
```cpp
class MyListIterator {
public:
int value;
bool is_end;
MyListIterator(int v, bool end) : value(v), is_end(end) {}
// 重载运算符*
operator int() const { return value; }
// 检查是否到达了列表结尾
bool operator==(const MyListIterator& other) const { return is_end == other.is_end; }
bool operator!=(const MyListIterator& other) const { return !(*this == other); }
};
// 实现一个函数来遍历自定义迭代器
void traverse_custom_iterator(const std::list<int>& list) {
auto iter = list.begin();
while(iter != list.end()) {
cout << *iter << " ";
++iter;
}
}
int main() {
std::list<int> my_list = {10, 20, 30, 40, 50};
traverse_custom_iterator(my_list);
return 0;
}
```
在这段代码中,我们定义了一个名为`MyListIterator`的类,实现了基本的迭代器操作。然后我们在主函数中创建了一个`std::list`实例,并使用这个自定义迭代器来遍历列表。
###
C++ 链表遍历
C++ 中的链表遍历可以使用循环或递归两种方式实现。
循环遍历:
```c++
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
void traverseList(ListNode* head) {
ListNode* cur = head;
while (cur != NULL) {
// 处理当前节点
cout << cur->val << " ";
// 移动到下一个节点
cur = cur->next;
}
}
```
递归遍历:
```c++
void traverseList(ListNode* head) {
if (head == NULL) {
return;
}
// 处理当前节点
cout << head->val << " ";
// 遍历下一个节点
traverseList(head->next);
}
```
以上两种方式都可以实现链表的遍历,循环方式通常更加高效,而递归方式则更加简洁易懂。
阅读全文