stl里的rend()函数
时间: 2024-05-11 14:19:47 浏览: 4
STL中的 `rend()` 函数是一个反向迭代器,它指向容器中最后一个元素的下一个位置。使用 `rend()` 函数可以方便地遍历容器中的元素,从最后一个元素开始向前遍历,直到第一个元素。
例如,在一个向量容器中使用 `rend()` 函数可以这样写:
```cpp
std::vector<int> myVec = {1, 2, 3, 4, 5};
for (auto it = myVec.rbegin(); it != myVec.rend(); ++it) {
std::cout << *it << " ";
}
```
这段代码将输出:`5 4 3 2 1`。
需要注意的是,使用 `rend()` 函数时要使用反向迭代器,即使用 `rbegin()` 函数获取反向迭代器。
相关问题
介绍一下STL中容器的成员函数
好的,STL中容器的成员函数包括以下几类:
1. 构造和析构函数:包括默认构造函数、复制构造函数、移动构造函数、拷贝赋值函数、移动赋值函数和析构函数。
2. 访问元素的函数:包括at()、operator[]、front()、back()和data()等函数,用于访问容器中的元素。
3. 修改元素的函数:包括insert()、erase()、push_back()、pop_back()、resize()、swap()等函数,用于修改容器中的元素。
4. 容器属性函数:包括size()、empty()、max_size()等函数,用于获取容器的一些属性。
5. 迭代器相关函数:包括begin()、end()、rbegin()、rend()、cbegin()、cend()、crbegin()和crend()等函数,用于实现容器中元素的迭代访问。
以上就是STL中容器的主要成员函数。
C++中STL list的实现
STL(Standard Template Library)是C++中的一个标准库,其中包含了许多常用的数据结构和算法。其中,list是一种常用的数据结构,它是一个双向链表,可以实现快速的插入和删除操作。
下面是C++中STL list的简单实现:
```cpp
template <typename T>
class List {
private:
struct Node {
T data;
Node* prev;
Node* next;
Node(const T& d = T(), Node* p = nullptr, Node* n = nullptr)
: data(d), prev(p), next(n) {}
};
Node* head;
Node* tail;
int size;
public:
List() : head(nullptr), tail(nullptr), size(0) {}
List(const List& other) : head(nullptr), tail(nullptr), size(0) {
for (const auto& item : other) {
push_back(item);
}
}
~List() {
clear();
}
List& operator=(const List& other) {
if (this != &other) {
List tmp(other);
swap(tmp);
}
return *this;
}
void push_back(const T& item) {
Node* new_node = new Node(item, tail, nullptr);
if (tail) {
tail->next = new_node;
} else {
head = new_node;
}
tail = new_node;
++size;
}
void push_front(const T& item) {
Node* new_node = new Node(item, nullptr, head);
if (head) {
head->prev = new_node;
} else {
tail = new_node;
}
head = new_node;
++size;
}
void pop_back() {
if (tail) {
Node* tmp = tail;
tail = tail->prev;
if (tail) {
tail->next = nullptr;
} else {
head = nullptr;
}
delete tmp;
--size;
}
}
void pop_front() {
if (head) {
Node* tmp = head;
head = head->next;
if (head) {
head->prev = nullptr;
} else {
tail = nullptr;
}
delete tmp;
--size;
}
}
T& front() {
return head->data;
}
T& back() {
return tail->data;
}
bool empty() const {
return size == 0;
}
int size() const {
return size;
}
void clear() {
while (!empty()) {
pop_back();
}
}
class iterator {
private:
Node* ptr;
public:
iterator(Node* p = nullptr) : ptr(p) {}
iterator(const iterator& other) : ptr(other.ptr) {}
iterator& operator++() {
ptr = ptr->next;
return *this;
}
iterator operator++(int) {
iterator tmp(*this);
ptr = ptr->next;
return tmp;
}
iterator& operator--() {
ptr = ptr->prev;
return *this;
}
iterator operator--(int) {
iterator tmp(*this);
ptr = ptr->prev;
return tmp;
}
T& operator*() const {
return ptr->data;
}
T* operator->() const {
return &(ptr->data);
}
bool operator==(const iterator& other) const {
return ptr == other.ptr;
}
bool operator!=(const iterator& other) const {
return ptr != other.ptr;
}
};
iterator begin() const {
return iterator(head);
}
iterator end() const {
return iterator(nullptr);
}
iterator rbegin() const {
return iterator(tail);
}
iterator rend() const {
return iterator(nullptr);
}
void swap(List& other) {
std::swap(head, other.head);
std::swap(tail, other.tail);
std::swap(size, other.size);
}
};
```
上述代码中,List类中定义了一个私有结构体Node,它表示双向链表中的每个节点。Node中包含了数据成员data、指向前一个节点的指针prev和指向后一个节点的指针next。List类中还包含了头指针head、尾指针tail和大小size等数据成员。
List类提供了许多操作,包括push_back、push_front、pop_back、pop_front、front、back、empty、size、clear等。其中,push_back和push_front分别表示在双向链表的末尾和开头插入一个元素,pop_back和pop_front分别表示删除双向链表的末尾和开头的元素,front和back分别表示获取双向链表的第一个和最后一个元素,empty表示判断双向链表是否为空,size表示获取双向链表中元素的个数,clear表示清空双向链表中的所有元素。
List类还定义了一个迭代器iterator,它可以用于遍历双向链表中的所有元素。迭代器中包含了一个指向Node的指针ptr,它可以指向双向链表中的任意一个节点。迭代器提供了许多操作,包括++、--、*、->、==、!=等。其中,++和--分别表示迭代器向前和向后移动一个位置,*表示获取迭代器所指向节点的数据成员data,->表示获取迭代器所指向节点的数据成员data的指针,==和!=分别表示判断两个迭代器是否相等和不相等。
List类中还提供了一些其他操作,比如拷贝构造函数、析构函数、赋值运算符、begin、end、rbegin、rend和swap等。其中,拷贝构造函数用于复制另一个List对象,析构函数用于释放所有节点的内存,赋值运算符用于将一个List对象赋值给另一个List对象,begin和end分别返回指向双向链表中第一个元素和最后一个元素的迭代器,rbegin和rend分别返回指向双向链表中最后一个元素和第一个元素的迭代器,swap用于交换两个List对象中的所有数据成员。