STLlist的使用(c++STL相关)

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);
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值