本文共 1750 字,大约阅读时间需要 5 分钟。
list是一种序列式容器,其实现方式类似于双向链表。list的每个节点包含三个域:前驱指针、数据域和后继指针。由于其基于链表结构,list的插入和删除操作可以在任意位置高效完成。然而,list不支持随机存取操作,迭代访问必须通过“++”或“--”操作完成。此外,list的内存空间是不连续的,整体效率在插入和删除方面优于vector,但在随机存取方面则不如deque。
vector类似于内置的数组,具有连续内存空间,支持高效的随机存取操作(通过[]操作符)。然而,vector的插入和删除操作在中间位置会导致内存拷贝,影响其效率。尽管如此,vector因其高效的随机存取性能,仍是最常用的容器之一。
list基于双向链表结构,内存空间不连续,通过指针连接节点。list支持在任意位置插入和删除,但由于其链表特性,随机存取效率低,且没有[]操作符。list的优点在于插入和删除效率高,适合频繁操作数据的场景。
deque是双端队列,支持在两端进行插入和删除,同时也支持随机存取操作。deque的实现结合了vector和list的优点,既能高效进行随机存取,又能在两端进行快速操作。
选择list、vector或deque应根据具体需求:
list<int> c0; 创建空链表。list<int> c1(3); 创建长度为3的链表,元素初始化为0。list<int> c2(5, 2); 创建长度为5的链表,元素为2。list<int> c4(c2); 创建c2的副本。list<int> c5(c1.begin(), c1.end()); 创建包含c1所有元素的链表副本。c.begin() 返回指向链表第一个元素的迭代器。c.end() 返回指向链表最后一个元素的迭代器。c.front() 返回第一个元素。c.back() 返回最后一个元素。push_back() 从末尾插入元素。push_front() 从开头插入元素。pop_back() 删除最后一个元素。pop_front() 删除第一个元素。erase() 删除单个或多个元素(有重载)。empty() 判断链表是否为空。resize(n) 调整链表长度为n,超出部分删除。clear() 清空链表。swap() 交换两个链表。merge() 合并两个链表并排序。#include#include #include int main() { std::vector myvector; for (size_t i = 0; i < 5; ++i) { myvector.push_back(i); } // 正向迭代 auto ibegin = myvector.begin(); auto iend = myvector.end(); for (ibegin; ibegin != iend; ++ibegin) { std::cout << *ibegin << std::endl; } // 反向迭代 auto rbegin = myvector.rbegin(); auto rend = myvector.rend(); for (rbegin; rbegin != rend; ++rbegin) { std::cout << *rbegin << std::endl; } return 0;}
上述代码展示了如何使用迭代器对vector进行正向和反向遍历。
转载地址:http://inxc.baihongyu.com/