首页 > 其他分享 >STL-list链表

STL-list链表

时间:2024-01-22 20:13:52浏览次数:34  
标签:容器 STL 元素 list back 链表 push

STL-list链表

目录

STL- list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。

这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。

list 容器中各个元素的前后顺序是靠 指针 来维系的,每个元素都配备了 2 个指针,分别指向它的前一个元素和后一个元素。

其中第一个元素的前向指针总为 null,因为它前面没有元素;同样,尾部元素的后向指针也总为 null。

list与vector的区别:

list不支持随机存取;
在list的任何位置执行插入和移除都非常快.插入和删除动作不影响指向其它元素的指针,引用,迭代器,不会造成失效;
list不支持随机存取,不提供下标操作符和at()函数;
list没有提供容量,空间重新分配等操作函数,每个元素都有自己的内存;
list也提供了特殊成员函数,专门用于移动元素.

初始化创建

list<A> listname;
list<A> listname(size);
list<A> listname(size,value);
list<A> listname(elselist);
list<A> listname(first, last);
#include <list>
using namespace std;

std::list<int> values;   //任何元素的空 list 容器
std::list<int> values(10, 5);   //10 个元素并且值都为 5 个 values 容器

添加删除元素

void push_front(const T& x);	// 头部添加
void push_back(const T& x);		// 尾部添加


void pop_front();		// 头部删除
void pop_back();		// 尾部删除

void  remove()          // 删除链表中的元素
#include <iostream>
#include <list>
using namespace std;
int main()
{
   std::list<int> my_list; // 创建一个空的整数链表

   // 在链表末尾插入元素
   my_list.push_back(1);
   my_list.push_back(2);
   my_list.push_back(3);

   // 在链表开头插入元素
   my_list.push_front(0);

   // 使用迭代器遍历链表并输出元素
   for (auto it = my_list.begin(); it != my_list.end(); ++it)
   {
      cout << *it << " ";
   }
   cout << endl;

   //访问链表第一个元素
   my_list.front() = 100;
   cout <<"frist :"<< my_list.front() << endl; 

   //访问链表最后一个元素
   cout << "end  :" << my_list.back() << endl;

   // 删除链表中的元素
   my_list.remove(2); // 删除元素2

   // 使用迭代器再次遍历链表并输出元素
   for (auto it = my_list.begin(); it != my_list.end(); ++it)
   {
      cout << *it << " ";
   }
   cout << endl;

   return 0;
}
// 指针 删除元素

std::list<int> my_list;  
my_list.push_back(1);  
my_list.push_back(2);  
my_list.push_back(3);  
auto it = my_list.begin();  
++it; // it指向元素2  
my_list.erase(it); // 删除元素2

遍历迭代

begin()		// 返回指向容器中第一个元素的双向迭代器。
end()		// 返回指向容器中最后一个元素所在位置的下一个位置的双向迭代器。
rbegin()	// 返回指向最后一个元素的反向双向迭代器。
rend()		// 返回指向第一个元素所在位置前一个位置的反向双向迭代器。
cbegin()	// 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend()		// 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin()	// 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend()		// 	和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。

list型容器不提供成员函数at()和操作符operator[],可以使用迭代器进行元素的访问

#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

void print(double& Ele)
{
	cout<<Ele<<" ,";
}

void main()
{
	// 初始化list
	list<double>mylist;
	mylist.push_back(11.1);
	mylist.push_back(21.5);
	mylist.push_back(31.6);
	mylist.push_back(41.7);

	int count=mylist.size();	// 获取大小
	for_each(mylist.begin(),mylist.end(),print); // 遍历打印


	cout<<endl;
	list<double>::iterator Iter_S;
	Iter_S=mylist.begin();
	cout<<"The third element is "<<*(++(++(++Iter_S)))<<endl;
}

参考函数

属性:

  • size(): 返回链表中的元素数量。
  • empty(): 检查链表是否为空,如果为空则返回 true,否则返回 false。

插入操作:

  • push_back(value): 在链表末尾插入一个元素。
  • push_front(value): 在链表开头插入一个元素。
  • insert(iterator position, value): 在给定位置之前插入一个元素。

删除操作:

  • remove(value): 删除链表中第一个值为指定值的元素。
  • erase(iterator position): 删除给定位置处的元素。
  • erase(iterator start, iterator end): 删除从 start 到 end(不包括 end)之间的元素。
  • clear() 清除元素

访问操作:

  • front(): 返回链表开头的元素。
  • back(): 返回链表末尾的元素。

迭代器操作:

  • begin(): 返回指向链表开头的迭代器。
  • end(): 返回指向链表末尾的迭代器的下一个位置,这是一个逻辑上的结束位置,不是真正的元素。
成员函数 功能
begin() 返回指向容器中第一个元素的双向迭代器。
end() 返回指向容器中最后一个元素所在位置的下一个位置的双向迭代器。
rbegin() 返回指向最后一个元素的反向双向迭代器。
rend() 返回指向第一个元素所在位置前一个位置的反向双向迭代器。
cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin() 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend() 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
size() 返回当前容器实际包含的元素个数。
max_size() 返回容器所能包含元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。
front() 返回第一个元素的引用。
back() 返回最后一个元素的引用。
assign() 用新元素替换容器中原有内容。
emplace_front() 在容器头部生成一个元素。该函数和 push_front() 的功能相同,但效率更高。
push_front() 在容器头部插入一个元素。
pop_front() 删除容器头部的一个元素。
emplace_back() 在容器尾部直接生成一个元素。该函数和 push_back() 的功能相同,但效率更高。
push_back() 在容器尾部插入一个元素。
pop_back() 删除容器尾部的一个元素。
emplace() 在容器中的指定位置插入元素。该函数和 insert() 功能相同,但效率更高。
insert() 在容器中的指定位置插入元素。
erase() 删除容器中一个或某区域内的元素。
swap() 交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。
resize() 调整容器的大小。
clear() 删除容器存储的所有元素。
splice() 将一个 list 容器中的元素插入到另一个容器的指定位置。
remove(val) 删除容器中所有等于 val 的元素。
remove_if() 删除容器中满足条件的元素。
unique() 删除容器中相邻的重复元素,只保留一个。
merge() 合并两个事先已排好序的 list 容器,并且合并之后的 list 容器依然是有序的。
sort() 通过更改容器中元素的位置,将它们进行排序。
reverse() 反转容器中元素的顺序。

参考资料

https://blog.csdn.net/u014779536/article/details/111301635

http://c.biancheng.net/view/6892.html

标签:容器,STL,元素,list,back,链表,push
From: https://www.cnblogs.com/tian777/p/17980864

相关文章

  • STL-stack和queue堆栈和队列
    STL-stack和queue堆栈和队列目录STL-stack和queue堆栈和队列堆栈和队列特性堆栈主要操作构造函数主要操作栈顶插入和删除大小相关简单案例队列的主要操作构造函数大小相关索引访问入队/出队优先队列priority_queue初始化构造小顶堆自定义结构体排序参考资料堆栈和队列特性stack......
  • STL-vector向量
    STL-vector向量目录STL-vector向量1.头文件2.构造函数3.索引存取元素4.遍历元素4.capacity相关5.插入元素6.删除元素7.排序和翻转8.底层原理9.特殊记忆函数总结参考资料vector数组是一个能存放任意数据类型(类,结构,普通变量类型等)的动态数组,在数据结构中就相当于顺序储存的线性......
  • STL-deque双端队列
    STL-deque双端队列目录STL-deque双端队列创建初始化插入元素删除元素遍历容器函数总览deque和vector参考资料deque是double-endedqueue的缩写,又称双端队列容器,可以对其两段的数据进行操作,因为它没有capacity属性,因此不会像vector那样”旧空间不足而重新配置一块更大空间,然后......
  • STL-Set集合
    STL-Set集合目录STL-Set集合导入构造插入删除查找元素遍历元素成员方法multisetunordered_set参考资料set集合unordered_set无序集合set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。set不允许两个元素有相同的键值。不允许出现相同的两个se......
  • STL-map/unordered_map映射
    STL-map/unordered_map映射目录STL-map/unordered_map映射1.构造初始化2.数据插入3.数据查找4.迭代器遍历5.删除和清空6.成员方法7.multimap8.unordered_map9.unordered_multimap10.底层原理11.总结12.参考资料键值对容器Map映射是一种类似于字典的数据结构。它是(键,值)对的序......
  • Queue-Linked List Implementation【1月22日学习笔记】
    点击查看代码//Queue-LinkedListImplementation#include<iostream>usingnamespacestd;structnode{ intdata; node*next;};node*front=NULL;node*rear=NULL;//末指针·,则不用遍历整个链表,constanttimevoidEnqueue(intx){ node*temp=newnode; ......
  • 【glibc】glib库单向链表GSList介绍
    glib库单向链表介绍glib库里实现了一些基本的数据结构,比如单向链表,双向链表、队列、树、hash表和数组。这篇文章里我主要介绍在linux平台下使用glib库中的单向链表进行编程,以后的文章我会陆续介绍双向链表、队列和其它数据结构的用法。单向链表(即GSList)是glib库里最简单的容具,它......
  • 【glibc】glib库双向链表GList介绍
    在上一篇文章里我介绍了glib库中单向链表的用法,这篇文章介绍glib库双向链表的用法,还是沿用上一篇文章的风格,采用在代码中加入注释来说明代码,最后贴出程序的运行结果,然后加以少量说明。双向链表与单向链表的区别是,从一个节点,不仅能访问到它的下一个节点,还能访问到它的上一个节点,其......
  • 传入一个List集合,返回分页好的数据
    传入一个List集合,返回分页好的数据。定义分页信息类:packagecom.cn.common;importjava.util.List;publicclassCommonPage<T>{privateintcurrentPage;privateinttotalPage;privateintpageSize;privatejava.util.List<T>list;publ......
  • List组件和Grid组件的使用
    简介在我们常用的手机应用中,经常会见到一些数据列表,如设置页面、通讯录、商品列表等。下图中两个页面都包含列表,“首页”页面中包含两个网格布局,“商城”页面中包含一个商品列表。上图中的列表中都包含一系列相同宽度的列表项,连续、多行呈现同类数据,例如图片和文本。常见的列......