【STL】list容器插入与删除
添加或插入新元素
list成员方法:
- push_front():向 list 容器首个元素前添加新元素;
- push_back():向 list 容器最后一个元素后添加新元素;
- emplace_front():在容器首个元素前直接生成新的元素;
- emplace_back():在容器最后一个元素后直接生成新的元素;
- emplace():在容器的指定位置直接生成新的元素;
- insert():在指定位置插入新元素;
- splice():将其他 list 容器存储的多个元素添加到当前 list 容器的指定位置处。
list.insert() 方法:
insert 使用与 vector、deque相同,详见vector容器的插入与删除。
list.splice() 方法:
和 insert() 成员方法相比,splice() 成员方法的作用对象是其它 list 容器,其功能是将其它 list 容器中的元素添加到当前 list 容器中指定位置处。
语法格式 | 功能 |
---|---|
void splice (iterator position, list& src); | position 为迭代器,用于指明插入位置;src 为另一个 list 容器。 此格式的 splice() 方法的功能是,将 src 容器中存储的所有元素全部移动当前 list 容器中 position 指明的位置处。 |
void splice (iterator position, list& src, iterator i); | position 为迭代器,用于指明插入位置;src 为另一个 list 容器;i 也是一个迭代器,用于指向 src 容器中某个元素。 此格式的 splice() 方法的功能是将 src 容器中 i 指向的元素移动到当前容器中 position 指明的位置处。 |
void splice (iterator position, list& src, iterator first, iterator last); | position 为迭代器,用于指明插入位置;src 为另一个 list 容器;[fist,last) 用于指定 src 容器中的某个区域。 此格式的 splice() 方法的功能是将 src 容器 [first, last) 范围内所有的元素移动到当前容器 position 指明的位置处。 |
list 容器底层使用的是链表存储结构,详见博客list的底层实现原理,splice() 成员方法移动元素的方式是,将存储该元素的节点从 list 容器底层的链表中摘除,然后再链接到当前 list 容器底层的链表中。这意味着,当使用 splice() 成员方法将 src 容器中的元素添加到当前容器的同时,该元素会从 src 容器中删除。
list<int>sample1{ 1,2,3,4 }, sample2{ 5,6,7 };
sample1.splice(sample1.begin(), sample2);
//sample1{5,6,7,1,2,3,4}
//sample2{ }
sample2.splice(sample2.begin(), sample1, sample1.begin());
//sample1{6,7,1,2,3,4}
//sample2{ 5 }
sample2.splice(sample2.end(), sample1, sample1.begin(), sample1.end());
//sample1{ }
//sample2{5,6,7,1,2,3,4}
注意:list容器迭代器为双向迭代器,不支持 p+i 或 p-i 操作,比较时不支持 > 、< 、>= 、<=运算符 ,各类迭代器用法详见迭代器类型
删除元素
成员函数 | 功能 |
---|---|
pop_front() | 删除位于 list 容器头部的一个元素。 |
pop_back() | 删除位于 list 容器尾部的一个元素。 |
erase() | 该成员函数既可以删除 list 容器中指定位置处的元素,也可以删除容器中某个区域内的多个元素。 |
clear() | 删除 list 容器存储的所有元素。 |
remove(val) | 删除容器中所有等于 val 的元素。 |
unique() | 删除容器中相邻的重复元素,只保留一份。 |
remove_if() | 删除容器中满足条件 |
- erase() 和 remove()示例 :
list<char>sample{ 'a','b','c','d','e','f','g' };
//erase
sample.erase(--sample.end());
//sample{'a','b','c','d','e','f'}
sample.erase(--sample.end(), sample.end());//区间[start,end)
//sample{'a','b','c','d','e'}
//remove
sample.remove('c');
//sample{'a','b','d','e'}
- unique() 示例:
//unique
list<int>sample_int{ 1,2,1,2,3,4,5,5,5 };
sample_int.unique();
//sample_int{1,2,1,2,3,4,5}
//unique与sort连用
sample_int.sort();
sample_int.unique();
//sample_int{1,2,3,4,5}
unique() 函数还可自定义去重规则:
//二元谓词函数:自定义去重规则
bool demo(double first, double second)
{
return (int(first) == int(second));
}
void main()
{
list<double> mylist{ 1.1, 1.2, 2.2, 2.3, 3.1, 4.1 };
mylist.unique(demo);
//mylist{1.1, 2.2, 3.1, 4.1}
}
规则可以用Lambda表达式以及函数对象的方式定义,要求返回值为bool型。若相邻两值满足规则,则去除重复值。
- remove_if() 示例:
通过将自定义的谓词函数(不限定参数个数)传给 remove_if() 成员函数,list 容器中能使谓词函数成立的元素都会被删除。
list<int> mylist{ 15, 16, 7, 17, 19, 9, 8};
//删除 mylist 容器中能够使 lamba 表达式成立的所有元素。
mylist.remove_if([](int value) {return (value < 10); });
//{15 16 17 19}