C++ List是STL(Standard Template Library)的 一个内置序列容器,允许非连续的内存分配。列表不提供快速的随机访问,它只支持两个方向的顺序访问。
C++列表可以在运行时从两端收缩或扩展。存储要求由内部分配器自动完成。默认情况下,列表是双链式的。由于它是一个双链接的列表,所以在列表上的插入和删除都很快速。
列表 使用非连续的内存分配,所以遍历比C++中的向量要慢。
列表允许在一个序列中的任何地方以恒定的时间进行插入和删除操作。
列表中的元素可以散落在不同的内存块中。容器存储必要的信息以允许对其数据进行顺序访问。
零大小的列表也是有效的。在这种情况下,list.begin() 和list.end() 会指向同一个位置。但调用 front() 或 back() 的行为是未定义的。
语法
从头文件中对 list 的定义如下。
template < class T, class Alloc = allocator<T> > class list;
参数
-
T- 包含的元素的类型。
T可以由任何其他数据类型代替,包括用户定义的类型。
-
Alloc- 分配器对象的类型。
默认情况下使用分配器类模板,它定义了最简单的内存分配模型,并且是与值无关的。
如果我们想制作一个整数的列表,我们可以通过下面的代码来制作它。
list<int> integer_list;
C++列表中的成员类型
以下成员类型可以作为成员函数的参数或返回类型使用。
| 编号:Sr.No. | 成员类型 | 定义 |
|---|---|---|
| 1 | 值类型 | T (模板的第一个参数) |
| 2 | 分配器类型 | Alloc (模板的第二个参数) |
| 3 | 参考 | value_type& |
| 4 | const_reference | const value_type&。 |
| 5 | 指针 | value_type* |
| 6 | const_pointer | 常数value_type* |
| 7 | 迭代器 | 对value_type的随机访问迭代器 |
| 8 | const_iterator | 对常量值类型的随机访问迭代器。 |
| 9 | 反向迭代器 | std::reverse_iterator . |
| 10 | const_reverse_iterator | std::reverse_iterator <const_iterator >。 |
| 11 | size_type | size_t |
| 12 | 差异类型 | ptrdiff_t |
列表构造函数
(1) 空容器构造函数 (默认构造函数)
构造一个没有元素的空容器。
(2) 填充构造函数
它构造了一个有n个元素的容器。每个元素都是val的一个副本。
(3) 范围构造函数
它构造了一个具有与范围[first, last]一样多的元素的容器,每个元素都由该范围中的相应元素按相同的顺序构造而成。
(4) 复制构造函数
它构造了一个容器,里面有x中每个元素的副本,顺序相同。
解构器
C++ 的析构函数 std::list::~list() 通过删除内存来销毁 list 对象。
你可以用下面的代码来定义C++的析构器。
~list();
C++中与List一起使用的函数
push_back()
用于在列表的末尾添加一个新元素。假设列表为L,我们想在其末尾插入一个元素。可以这样做。
L.push_back(element);
push_front()
它们用于在列表的开始添加一个新元素。例如,假设列表是L,我们想在其前面插入一个元素。可以像这样做。
L.push_front(element);
pop_back()
它们用于从列表的末端移除一个元素。将列表的大小减少一个。例如,假设列表是L,可以这样做。
L.pop_back();
pop_front()
它们用于从列表的开始位置移除一个元素。将列表的大小减少一个。例如,假设列表是 L。
L.pop_front();
front()
它返回列表中的第一个元素。所以如果我们想检查列表中第一个元素的值,可以使用它。
L.front();
back()
它返回列表中的最后一个元素。因此,如果我们想检查列表中最后一个元素的值,可以使用它。
L.back();
empty()
如果列表是空的,它返回 1。否则,它返回 0。
L.empty();
insert()
它用于在列表的任何位置插入元素。它需要三个参数:位置,要插入的几个元素,以及要插入的值。默认情况下,元素的数量被设置为 1。
L.insert(iterator, num_of_elements, element);
erase()
它用于从列表中删除一个元素或一系列元素。要删除一个元素,只需传递一个整数位置,该元素将被删除。要删除一个范围,必须给出起始迭代器和结束迭代器。
L.erase(list_iterator); // to delete one element
L.erase(start_iterator, last_iterator); // for range
assign()
它用于通过替换当前元素和调整列表大小来向列表分配新元素。两个参数要分配的值的数量,第二个是要分配的值。
L.assign(number of times, value);
remove()
它以一个值为参数,从列表中删除所有具有此值的元素。
L.remove(value);
reverse()
顾名思义,它颠倒了列表中元素的顺序。
L.reverse();
size()
它返回列表中存在的元素数量。
L.size();
begin()
它返回到列表中第一个元素的迭代器。
List <data_type>::iterator = L.begin();
end()
它返回指向理论上最后一个元素的迭代器,该元素在最后一个元素之后。
L.end();
sort()
它用于对一个列表中的元素按照递增的顺序进行排序。
L.sort();
clear()
它用于移除列表容器中的所有元素。所以列表的大小变成了0。
L.clear();
让我们看看下面的示例代码。
// list.cpp
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void showTheContent(list<int> l)
{
list<int>::iterator it;
for(it=l.begin();it!=l.end();it++)
{
cout << *it << " ";
}
cout << "\n";
}
int main()
{
// Sample Code to show List and its functions
list<int> list1,list2;
int i;
// inserting at the back
for(i=0;i<10;i++)
list1.push_back(i+1);
//inserting at the front
for(i=0;i<10;i++)
list2.push_front(i+1);
cout << "Content of List 1: ";
showTheContent(list1);
cout << "Content of list 2: ";
showTheContent(list2);
// sorting the second list
list2.sort();
cout << "Sorted List2 : ";
showTheContent(list2);
//Removing five elements from front in list1.
int times = 5;
while(times--)
{
list1.pop_front();
}
cout << "Content of List 1: " ;
showTheContent(list1);
//Removing five elements from the back in list2.
times=5;
while(times--)
{
list2.pop_back();
}
cout << "Content of List 2: ";
showTheContent(list2);
//seek the first element of list 1
cout << list1.front() << " is now at the front in list 1\n";
// seek the last element in list 2
cout << list2.back() << " is now the last element in list 2\n";
//Inserting elements in list 1.
list1.insert(list1.begin(),5,10);
cout << "After Insertion list 1: ";
showTheContent(list1);
//remove() to remove all the elements with value 10.
list1.remove(10);
cout << "After Removal list 1: ";
showTheContent(list1);
// size() to know the number of elements
cout << "No. of elements in list 1: ";
cout << list1.size() << "\n";
//Reversing the content of list 2
list2.reverse();
cout << "Reversed list 2: ";
showTheContent(list2);
//erasing first element of list 2
list2.erase(list2.begin());
cout << "After erasing from list 2: ";
showTheContent(list2);
//Removing all elements from list 1.
list1.clear();
// Use of empty() function
if(list1.empty()) cout << "List 1 is now empty\n";
else cout << "Not Empty\n";
// use of assign function
list1.assign(5,2); // 2 2 2 2 2
cout << "List 1: ";
showTheContent(list1);
return 0;
}
请看下面的输出。
本教程就到此为止。