STL-list链表

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

posted @ 2024-01-22 20:00  贝壳里的星海  阅读(6)  评论(0编辑  收藏  举报