行业知识
STL——list详解
2026-11-05 05:33:26
来源:互联网转载
一、list基本使用
1.1 初始化
在C++11之前,std::list容器没有提供初始化列表的构造函数,因此需要使用push_back或push_front函数向列表中添加元素。以下是一些常见的std::list初始化方式:
- 使用默认构造函数创建空列表
std::list mylist;
- 使用列表初始化语法创建列表
std::list mylist = {1, 2, 3}; - 使用指定大小和默认值创建列表
std::list mylist(5, 0); // 创建一个包含5个0的列表
- 使用迭代器创建列表
int arr[] = {1, 2, 3};std::list mylist(arr, arr+3); - 复制另一个列表来创建一个新列表
std::list mylist1 = {1, 2, 3};std::list mylist2(mylist1); - 使用移动语义从另一个列表创建一个新列表
std::list mylist1 = {1, 2, 3};std::list mylist2(std::move(mylist1)); 注意,使用移动语义可以更高效地将一个列表复制到另一个列表中,因为它避免了在内存中进行大量的数据复制。
经过std::move操作后,mylist1的内部资源所有权已经被转移,因此mylist1不再拥有自己的数据。使用mylist1的任何操作(如访问、修改、遍历等)都将导致未定义行为。因此,如果需要继续使用mylist1,应该在std::move之前将其清空,或者将其重新初始化为一个新列表。
1.2 常用接口
std::list是C++ STL标准库中的一个容器,它实现了一个双向链表。以下是一些常见的std::list的使用方式:
- 在列表的末尾添加元素
std::list mylist;mylist.push_back(1);mylist.push_back(2);mylist.push_back(3);
- 在列表的开头添加元素
std::list mylist;mylist.push_front(1);mylist.push_front(2);mylist.push_front(3);
- 遍历列表中的元素
std::list mylist = {1, 2, 3};for (auto it = mylist.begin(); it != mylist.end(); ++it) { std::cout 1, 2, 3};auto it = mylist.begin();++it;mylist.insert(it, 4);// mylist: {1, 4, 2, 3}1, 2, 3};auto it = mylist.begin();++it;mylist.erase(it);// mylist: {1, 3}1, 2, 3};mylist.reverse();// mylist: {3, 2, 1}3, 1, 2};mylist.sort();// mylist: {1, 2, 3}template//带默认参数的构造函数__list_node(const T& x = T()):_next(nullptr),_prev(nullptr),_data(x){}__list_nodetypedef __list_node}Ref operator*() {return _node-_data;}Ptr operator->() {return &(_node->_data);}bool operator==(const self& it)const {return _node == it._node;}bool operator!=(const self& it)const {return _node != it._node;} // 前置++self& operator++() {_node = _node->_next;return *this;} // 后置++self operator++(int) {self tmp(*this);//self tmp(_node);_node = _node->_next;return tmp;}Node* _node;//迭代器唯一的成员变量:__list_node结构体对象的指针};templateclass list{public:typedef __list_node Node;typedef __list_iterator iterator;typedef __list_iterator const_iterator;list(){_head = new Node;//调用__list_node的构造函数_head->_next = _head;_head->_prev = _head;}template list(InputIterator first, InputIterator last) {_head = new Node;_head->_next = _head;_head->_prev = _head;while (first != last) {push_back(*first);first++;}}list(const list& lt) {_head = new Node;_head->_next = _head;_head->_prev = _head;list tmp(lt.begin(), lt.end());std::swap(_head, tmp._head);}iterator begin() {return iterator(_head->_next);}iterator end() {return iterator(_head);}const_iterator begin()const {return const_iterator(_head->_next);}const_iterator end()const {return const_iterator(_head);}iterator insert(iterator pos, const T& val) {Node* newnode = new Node(val);Node* cur = pos._node;Node* prev = cur->_prev;prev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;return iterator(newnode);}void push_back(const T& x) {insert(end(), x); }iterator erase(iterator pos) {assert(pos != end());Node* cur = pos._node;Node* next = cur->_next;Node* prev = cur->_prev;delete cur;prev->_next = next;next->_prev = prev;return iterator(next);//返回被删除节点的下一位置}void clear() {iterator it = begin();while (it != end()) {it = erase(it);}}list& operator=(list lt) {swap(_head, lt._head);return *this;}private:Node* _head;};void print_list(const list& lt) {list::const_iterator it = lt.begin();while (it != lt.end()) {cout public: // class implementation};
上一篇:怎么查关于icp备案?
下一篇:服务器精验熔炉怎么用?