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