《list的介绍使用》《list的构造》《listiterator使用 》《listcapacity》《list迭代器失效问题》

tech2025-07-30  12

1.list的介绍使用

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个素。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

list的构造 list () 构造空的list list (size_type,const value_type& val=value_type()) 构造的list中包含n个值为val的元素 list (const list& x) 拷贝构造函数 list (inputlterator first,inputlterator last) 用(first , last)区间中的元素构造list

int main() { list<int>l1; //构造空的l1 list<int>l2(4, 100); //l2中放置4个值为100 的元素 list<int>l3(l2.begin(), l2.end()); //用l2左闭右开的区间构造l3 list<int>l4(l3); //用l3构造l4 int array[] = { 1, 3, 4, 5 }; //以数组为迭代器区间构造l5 list<int>l5(array, array + sizeof(array) / sizeof(0)); //以迭代器方式打印l5中的元素 for (list<int>::iterator it = l5.begin(); it != l5.end(); it++) { cout << *it << ""; cout << endl; } //c++11范围for的方式遍历 for (auto& e : l5) cout << e << ""; cout << endl; system("pause"); return 0; }

list iterator的使用

void print_list(const list<int>& l) { for (list<int>::const_iterator it = l.begin(); it != l.end(); it++) { cout << *it << ""; } cout << endl; } int main() { int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; list<int>l(array, array + sizeof(array) / sizeof(array[0])); //试用正向迭代器打印list中的元素 for (list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << ""; cout << endl; } //使用反向迭代器逆向打印list中的元素 for (list<int>::reverse_iterator it = l.rbegin(); it != l.rend(); it++) { cout << *it << ""; cout <<endl; } system("pause"); return 0; }

list capacity empty 检测list知否为空,是返回true,否返回false size 返回list中有效节点的个数

list modifiers push front 在list首元素前插入值为value的元素 pop front 删除list中的第一个元素 push back 在list尾部插入值为value的元素 pop back 删除list中的最后一个元素 insert 在list POS位置插入值为value的元素 erase 删除list POS位置的元素 swap 交换两个list中的元素 clear 清空list中的元素

void PrintList(list<int>& l) { for (auto& e : l) cout << e << " "; cout << endl; } // push_back/pop_back/push_front/pop_front void TestList1() { int array[] = { 1, 2, 3 }; list<int> L(array, array + sizeof(array) / sizeof(array[0])); // 在list的尾部插入4,头部插入0 L.push_back(4); L.push_front(0); PrintList(L); // 删除list尾部节点和头部节点 L.pop_back(); L.pop_front(); PrintList(L); } // insert /erase void TestList3() { int array1[] = { 1, 2, 3 }; list<int> L(array1, array1 + sizeof(array1) / sizeof(array1[0])); // 获取链表中第二个节点 auto pos = ++L.begin(); cout << *pos << endl; // 在pos前插入值为4的元素 L.insert(pos, 4); PrintList(L); // 在pos前插入5个值为5的元素 L.insert(pos, 5, 5); PrintList(L); // 在pos前插入[v.begin(), v.end)区间中的元素 vector<int> v{ 7, 8, 9 }; L.insert(pos, v.begin(), v.end()); PrintList(L); // 删除pos位置上的元素 L.erase(pos); PrintList(L); // 删除list中[begin, end)区间中的元素,即删除list中的所有元素 L.erase(L.begin(), L.end()); PrintList(L); } // resize/swap/clear void TestList4() { // 用数组来构造list int array1[] = { 1, 2, 3 }; list<int> l1(array1, array1 + sizeof(array1) / sizeof(array1[0])); PrintList(l1); // 交换l1和l2中的元素 l1.swap(l2); PrintList(l1); PrintList(l2); // 将l2中的元素清空 l2.clear(); cout << l2.size() << endl; }

list迭代器失效问题 迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

最新回复(0)