list是一个双向串列,内存是一个个分配的
STLlist具有以下一些特点:
特点:
1、不支持随机访问元素,访问头尾部元素速度快
2、任何位置插入删除元素都很快
3、插入和删除不会造成迭代器失效
4、对于异常支持的好
5、交换也是内部指针进行交换
6、可以用advance或next直接获得迭代器第五个元素
7、用remove表示该值全部删除,也可以在remove_if中用lamba函数进行条件删除
8、用reverse进行元素反转
9、用sort进行排序
10、两个排好序的list可以用merge进行合并,被合并的那个list将被清空
11、unique也需要排好序然后将重复的去掉,未排好序只会合并相邻的相同值
12、splice可以将b作为一块内容合并到c头部
缺点:
1、遍历效率不高,空间占用率大需要生成头尾两个指针
以下是STLlist完整接口代码:
static void listPart() {
// list 是c++98中引入的双向串列(doubley linked list)
// namespace std {
// template<typename T, typename Allocator = allocator<T>>
// class list;
// }
// 特点不支持随机访问元素,访问头部和尾部元素速度快
// 任何位置插入删除元素都很快,常量时间内完成
// 插入和删除不会造成迭代器失效
// 对于异常支持的好,出现异常对于list而言,要不成功,要不什么影响没有
using Group = std::list<float>;
Group a;
Group b = a;
Group c(a);
Group d(10);
Group e(10, 1.0f);
Group f(e.begin(), e.end());
Group g({1.0f, 2.0f, 3.0f});
Group h = {1.0f, 3.0f, 4.0f};
d.empty();
d.size();
d.max_size();
// 和vector不同,list不提供以下的函数
//d.capacity();
//d.reserve(100);
//d.shrink_to_fit();
// operator == != < > <= >=
// 赋值
b = g;
b.assign(3, 1.0f);
b.assign(g.begin(), g.end());
b.assign({1.0f, 2.0f, 3.0f});
// 交换
b.swap(a);
std::swap(a,b);
// 元素访问,不能随机访问
//b[0];
//b.at(0);
b.front();
b.back();
// 迭代器相关
a.begin();
a.end();
a.cbegin();
a.cend();
a.rbegin();
a.rend();
a.crbegin();
a.crend();
auto iterBegin = a.begin();
//assert(a.size() >= 10);
//for(int i = 0;i < 5; ++i) ++iterBegin;
//std::advance(iterBegin, 4);
//auto iter5 = std::next(iterBegin, 4);
a.pop_back(); // maybe wrong
if(!a.empty()) a.pop_back();
b.erase(b.begin());
b.erase(b.begin(), b.end());
b.push_back(10.0f);
b.pop_back();
b.push_front(1.2f);
b.emplace_front(1.3f);
auto iter = b.insert(b.end(), 100.0f);
iter = b.insert(b.end(), 10, -10.0f);
b.insert(b.end(), h.begin(), h.end());
b.emplace(b.end(), 10.0f);
b.emplace_back(10.0f);
b.resize(10);
b.resize(100, 1.0f);
// 算法
b.remove(1.0f);
b.remove_if([](auto v) { return v > 100.0f;});
b.reverse(); // 1 2 3 4 -> 4 3 2 1
//std::sort(a.begin(), a.end());
b.sort(); // <
g.sort(); //
b.merge(g);
c.unique(); // 1 1 2 2 1 1 3 4 -> 1 2 1 3 4
c.splice(c.begin(), b);
}