C++STL容器篇List

list的特点数据结构为双向链表,当你需要大量进行插入操作时候应选择它,
不提供随机访问接口,使用时应包含头文件list,打开std命名空间。

**list的迭代器:**双向迭代器(所以凡是用到随机存取迭代器的算法都不能调用)

list的存储方式和增长方式: 双向链表结构,新建结点插入。

list的常用定义:

list<T>c;  //产生一个空的list,存储T类型对象
list<T>c1(c2);  //产生一个与c2同型别的list,将每个元素都复制
list<T>c(n);  //产生拥有n个元素的list,默认值由T构造函数决定
list<T>c(n,elem);  //效果同上,elem为指定的默认值
list<T>c(iterator1,iterator2);//将[itreator1,iterator2)的元素为初始值
list<int>t = {1,2,3,4};  //列表式初始化
c.~list<T>();  //销毁所有元素,释放内存
容器容量函数 效果
c.size() 返回元素个数
c.empty() 判断容器是否为空
c.max_size() 元素的最大可能数量(一般不用)
赋值交换函数 效果
c1=c2 将c2的全部元素赋值给c1
c.assign(n,elem) 将c的内容赋值为n个值为elem的元素
c.assign(iterator1,iterator2) 将c的内容赋值为区间[iterator1,iterator2)指向的元素
c.swap(c2) 将c和c2互换
swao(c1,c2) 效果同上,但效率不如上版本(此版本为泛化)

元素的存取:list不支持随机存取,只有back()和front()能直接存取元素

元素存取函数 效果
c.front() 返回第一个元素,不检查元素是否存在
c.back() 返回最后一个元素,不检查元素是否存在

由于这些操作不检查容器是否为空,可能会发生未定义行为,调用者最好在操作前使用c.empty()检查容器是否为空。

迭代器相关函数 效果
c.begin() 返回一个双向迭代器,指向第一个元素
c.end() 返回一个双向迭代器,指向最后一个元素的下一位置
c.rbegin() 返回一个双向迭代器,指向逆向迭代的第一个元素
c.rend() 返回一个双向迭代器,指向逆向迭代的最后一个元素的下一位置
list的安插、移除函数 效果
c.insert(iterator,elem) 在迭代器iterator指向的位置前添加元素elem,返回指向elem的迭代器
c.insert(iterator,n,elem) 在迭代器iterator指向的位置前添加n个元素elem,返回指向iterator-n位置元素的迭代器
c.insert(iterator1,iterator2,iterator3) 在iterator1前插入区间[iterator2,iterator3)内的元素,并返回指向iterator1-n位置上的迭代器,n为插入元素的个数
c.push_back(elem) 在尾部添加一个elem的副本
c.pop_back() 移除最后一个元素
c.push_front(elem) 在头部添加一个elem的副本
c.pop_front() 移除头部第一个元素
c.remove(val) 移除容器中所有值为val的元素
c.remove_if(op) 接受一个函数对象,移除所有满足函数的元素
c.erase(iterator) 移除iterator指向的元素,返回指向下一元素的迭代器
c.erase(iterator1,iterator2) 移除[iterator1,iterator2)区间的元素,返回iterator2迭代器
c.resize(num) 将容器元素个数改为num个,若num<c.size(),则移除多出的元素,若num>c.size(),则增加元素,默认值由构造函数决定
c.resize(num,elem) 效果同上,elem为指定默认值
c.clear() 将容器全部元素移除,清空容器

关于c.remove_if的使用:

   list<int>c = {1,2,3,4};
	for (auto e : c)
		cout << e;
	cout << endl;

	cout << "删除c中小于i的元素:";
	int i;
	cin >> i;
	//提供两种使用方法,1:使用库函数,2:自定义lambada 表达式---临时函数
	//c.remove_if(bind2nd(less<int>(),i));
	//c.remove_if([i](int x)->bool { return i > x; });  
	
  	for (auto e : c)
		cout << e;
	cout << endl;
list的特殊成员函数 效果
c.sort() 将容器内的元素按升序排序
c.sort(op) 以op()为准则排序,[](int x,int y)->bool{return x>y; } 一种降序的写法
c.unique() 移除相邻重复元素,建议调用前先用sort()函数排序
c.unique(op) op是接受两个参数的函数,分别传入前后两个元素,满足条件移除元素
c.splice(iterator,c2) 将c2的所有元素转移到iterator指向的位置,iterator应为c的迭代器,c2容器被清空
c1.splice(iterator,c2,c2iterator) 将c2iterator指向的元素转移到c1中iterator指向的位置前面
c1.splice(iterator,c2iterator1,c2iterator2) 同上,两个迭代器为转移元素的范围
c.merge(c2) 假设c和c2容器元素已序,将c2的全部元素转到c中,并保证合并后仍有序
c.reverse() 将所有元素反序

关于c.unique(op)的使用例子

int main()
{
	list<int>c1 = {0,1,3,2,3,4,5};
	c1.unique([](int i, int j)->bool { return (j - i) == 2; });
	copy(c1.begin(),c1.end(),ostream_iterator<int>(cout," "));//输出结果012345

   list<int>c2 = {0,2,3,3,5,5,4};
	c2.unique([](int i, int j)->bool { return (j - i) == 2; });
	copy(c2.begin(),c2.end(),ostream_iterator<int>(cout," "));//输出结果0334

//可以看到,我们会将满足函数条件的第二参数移除,每个j都与i比较
//注意!注意!!判断式是并非拿元素与前一紧邻元素比较
//而是与其未被移除的前一元素比较。
}

关于异常,list的异常安全性得到了最佳支持,所有操作(除了排序和赋值)要么成功,要么无效。

原创文章 23 获赞 1 访问量 372

猜你喜欢

转载自blog.csdn.net/weixin_44806268/article/details/105415555