目录
list的介绍
list的使用
构造相关的
空构造
构造n个值为val的元素
用一段迭代区间构造
拷贝构造
列表格式化
遍历相关的
迭代器正反遍历
范围for遍历
修改相关的
push_back和pop_back
push_front和pop_front
insert和erase
swap
resize
clear
容量相关的
size
empty
元素访问相关的
front
back
迭代器相关的
begin和end
rbegin和rend
cbegin cend和crbegin crend
操作相关的
reverse
sort
merge
unique
remove_if
remove
splice
assing
总结函数的使用:
编辑
- list是可以在常数范围内任意位置进行插入和删除的序列容器,并且该容器可以前后双向迭代.
- list的底层是双链表结构,链表中每一个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素.
- list与forward_list非常相似,主要不同在于forward_list是单链表,只能向前迭代.
- 与其他的序列容器相比(array,vector,deque),list通常在任意位置进行插入移除元素的效率更好.
- 与其他容器相比,list和forward_list最大的缺陷是不支持任意位置的访问.
list l1;
list l2(4, 100);
string s1("hello world");
list l4(s1.begin(),s1.end());
int array[] = { 1,2,3,4 };
list l5(array, array + sizeof(array) / sizeof(array[0]));
list l2(4, 100);
list l3(l2);
list l6{ 1,2,3,4,5 };
正向遍历
list l1{ 1,2,3,4,5,6 };
list::iterator it = l1.begin();
while (it != l1.end())
{
cout << *it << " ";
it++;
}
cout << endl;
反向遍历
list::reverse_iterator rit = l1.rbegin();
while (rit != l1.rend())
{
cout << *rit << " ";
++rit;
}
cout << endl;
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
提示:范围for底层的实现也是迭代器
push_back是在末尾插入一个元素,pop_back是在末尾删除一个元素
list l1{ 1,2,3,4,5,6 };
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
//push_back
l1.push_back(7);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
//pop_back
l1.pop_back();
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
push_front是在容器的前面插入一个元素,pop_front是在容器的前面删除一个数据.
//push_front
l1.push_front(0);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
//pop_front
l1.pop_front();
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
insert是在pos为值插入一个元素,erase实在pos位置删除一个元素.
//insert
l1.insert(l1.begin(), 0);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
//erase
l1.erase(l1.begin());
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
swap是交换两个容器的内容
list l1;
list l2{ 1,2,3,4 };
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
l1.swap(l2);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
for (auto e : l2)
{
cout << e << " ";
}
cout << endl;
resize使用规则:
- 当n大于当前容器的size是,将size扩大到n,扩大的数据为给出的第二个值,若未给出,调用其构造函数给出默认值.
- 当n小于当前的size时,将size缩小到n
l1.resize(3);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
clear是清除元素的有效内容
l1.clear();
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
size返回的是容器有效元素的个数
list l1{ 1,2,3,4 };
cout << l1.size() << endl;
empty返回的是bool值,若容器为空返回true,不为空返回false.
front返回的是首元素的值.
list l1{ 1,2,3,4 };
cout << l1.front()<
back返回的是尾元素的值
list l1{ 1,2,3,4 };
cout << l1.front()<
begin返回的是第一个有效元素的迭代器,end返回的是最后一个元素下一个位置的迭代器.
list l1{ 1,2,3,4 };
//begin和end
list::iterator begin = l1.begin();
cout << *begin << endl;
list::iterator end = l1.end();
cout << *(--end) << endl;
rbegin返回的是最后一个元素的迭代器,rend返回的是第一个元素前一个位置的迭代器.
//rbegin和rend
list::reverse_iterator rbegin = l1.rbegin();
cout << *(rbegin) << endl;
list::reverse_iterator rend = l1.rend();
cout << *(--rend) << endl;
这四个函数在这里就不介绍了,和前面四个类似,不过这四个返回的是不可修改的.
reverse函数将容器内的元素逆置.
list l1{ 1,2,3,4 };
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
l1.reverse();
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
sort函数将容器当中的元素默认以升序进行排序.
list l2{ 4,5,7,3,8 };
l2.sort();
for (auto e : l2)
{
cout << e << " ";
}
cout << endl;
merge将一个容器内个元素合并到另一个元素. 但是两个容器内的内容需要是有序的.
list l3 = {1,2,3,4};
list l4{ 5,6,7,8 };
l3.merge(l4);
unique用于删除容器中连续的重复元素.
list l5{ 1,2,2,3,3,4,4,4,4 };
l5.unique();
for (auto e : l5)
{
cout << e << " ";
}
cout << endl;
remove_if函数用于删除容器中满足条件的元素.
bool single_digit(const int& val)
{
return val > 10;
}
void test9()
{
list l1{ 1,23,2,5,4,8,64,2,85,2 };
l1.remove_if(single_digit);//删除大于10的元素
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
}
用于删除容器中特定值的元素.
list l1{ 1,2,3,4,5 };
l1.remove(5);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
splice函数用于两个容器之间的拼接,
- 将整个容器拼接到另一个容器指定的位置.
- 将指定容器中的一个数据拼接到另一个容器的指定位置.
- 将指定容器中一段区间的数据拼接到另一个容器的指定位置.
void test11()
{
list l1(6, 6);
list l2(8, 8);
l1.splice(l1.end(), l2);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
list l3(6, 6);
list l4(8, 8);
l3.splice(l3.end(), l4, l4.begin());
for (auto e : l3)
{
cout << e << " ";
}
cout << endl;
list l5(6, 6);
list l6(8, 8);
l5.splice(l5.begin(),l6, l6.begin(), l6.end());
for (auto e : l5)
{
cout << e << " ";
}
}
assing函数将新内容分配给容器,替换器当前内容.
- 将n个值为val的数据分配给容器.
- 将一段迭代区间内容分配给容器.
void test12()
{
list l1(4, 6);
l1.assign(4, 8);
for (auto e : l1)
{
cout << e << " ";
}
cout << endl;
int array[] = { 1,1,1,1 };
list l2(4, 6);
l2.assign(array, array + sizeof(array) / sizeof(array[0]));
for (auto e : l2)
{
cout << e << " ";
}
cout << endl;
}