List container

C++ STL List详解
本文详细介绍了C++标准模板库中的List容器,包括其构造函数、成员函数及使用示例等,帮助读者全面掌握List的基本操作与应用技巧。
//List容器
//List本质是一个双向链表

//构造函数
list<int>c0;            //空链表
list<int>c1(3);       //建一个含三个默认值是0的元素链表
list<int>c2(5,2);    //含5个元素,值都是2
list<int>c4(c2);     //复制链表
list<int>c5(c1.begin(), c1.end());  //c5包含c1的一个区域元素

//成员函数
c.begin()    //返回链表第一个元素的迭代器
c.end()       //返回指向链表最后一个元素之后的迭代器

c.rbegin()   //返回逆向链表的第一个元素,即c链表的最后一个数据
c.rend()      //返回逆向链表的最后一个元素下一个位置,即c链表的第一个数据再往前的位置
//example
list<int>l1 = {1,2,3,4};
	for (list<int>::reverse_iterator it = l1.rbegin(); it != l1.rend(); it++)
		cout << *it << endl;
	
operator=    //重载赋值元素符

c.assign(n, num)   //将n个num拷贝赋值给链表c
c.assign(beg, end) //将[beg, end]区间的元素拷贝赋值给链表c	
//Example    
	list<int>l1 ;
	l1.assign(2, 10);
	for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
		cout << *it << endl;
	l1.clear();
	int a[5] = { 1, 2, 3, 4, 5 };
	l1.assign(a, a + 5);
	for (list<int>::iterator it = l1.begin(); it != l1.end(); it++)
		cout << *it << endl;
	
c,front()     //返回第一个元素
c.back()     //返回最后一个元素

c.empty()   //判空

c.size()       //返回元素个数

c.max_size()  //返回可能容纳最大元素数量

c.clear()      //清除c中所有元素

c.insert(pos,num)         //在pos位置插入元素num。
c.insert(pos,n,num)      //在pos位置插入n个元素num。
c.insert(pos,beg,end)    //在pos位置插入区间为[beg,end)的元素。

c.erase(pos)      //删除pos位置元素

c.push_back(num)      //在末尾增加一个元素。
c.pop_back()              //删除末尾的元素。
c.push_front(num)     //在开始位置增加一个元素。
c.pop_front()              //删除第一个元素。

c.resize(n)                  //重新定义链表长度,超出原始长度部分用0代替,小于原始部分删除
c.resize(n, num)         //重新定义链表长度,超出原始长度部分用num代替,小于原始部分删除

c1.swap(c2);               //将c1和c2交换。
swap(c1,c2);               //同上。

c1.merge(c2)              //合并2个有序的链表并使之有序,重新放到c1里,释放c2。
c1.merge(c2,comp)    //合并2个有序的链表并使之按照自定义规则排序之后重新放到c1中,释放c2,comp为比较函数,默认合成为升序
//comp是一个函数名称
//要依据实际情况设计compare
bool compare(int n1, int n2)
{
	return n1 > n2;
}

int main()
{
	list<int>l1{ 4,2,1 }, l2{ 6,5,3 };
	list<int>::iterator it;
	l1.merge(l2,compare);
	for (it = l1.begin(); it != l1.end(); it++)
		cout << *it << endl;

	return 0;
}

c1.splice(c1.beg, c2)   //将c2连接在c1的beg位置,释放c2
//Example
    list<int>l1{ 1, 2, 3 }, l2{ 4, 5, 6 };
	l1.splice(l1.begin(), l2);
	list<int>::iterator it;
	for (it = l1.begin(); it != l1.end(); it++)
		cout << *it << endl;  
	
c1.splice(c1.beg, c2, c2.beg)   //将c2的beg位置的元素连接到c1的beg位置,并且在c2中释放掉beg位置的元素

c1.remove(num)                 //删除链表中匹配num的元素。

c1.remove_if(comp)                //删除条件满足的元素,参数为自定义的回调函数。
//Example
bool compare(int n)
{
	return n < 2;
}
int main()
{
	list<int>l1{ 1, 2, 3 }, l2{ 4, 5, 6 };
	list<int>::iterator it;
	l1.remove_if(compare);
	for (it = l1.begin(); it != l1.end(); it++)
		cout << *it << endl;

	system("pause");
	return 0;
}

c1.reverse()                            //反转链表

c1.unique()                            //删除相同的元素,只剩下一个

c.sort()                                   //将链表排序,默认升序
c.sort(comp)                          //自定义回调函数实现自定义排序

  

转载于:https://www.cnblogs.com/KennyRom/p/5950686.html

<think>嗯,用户想了解HarmonyOS中ListContainer的使用方法或实现细节。首先,我需要回忆一下HarmonyOS的文档,特别是关于UI组件的部分。记得ListContainer是用于展示列表数据的组件,类似于Android的ListView或RecyclerView。 首先,我应该介绍ListContainer的基本概念和用途,说明它在界面开发中的重要性。然后,分步骤讲解如何使用,包括XML布局中的添加、数据适配器的创建、数据绑定的方法,以及事件处理的实现。可能还需要提到性能优化的技巧,比如视图复用和分页加载。 需要注意的是,用户可能需要具体的代码示例,所以应该提供Java或XML的代码片段。同时,要确保代码符合HarmonyOS的最新API,避免使用过时的方法。此外,用户可能会遇到常见问题,比如数据更新不刷新、性能问题等,需要给出解决方案。 还要检查是否有相关的官方文档或开发者指南可以引用,比如引用HarmonyOS的开发者文档或最佳实践指南。最后,生成相关问题,帮助用户进一步学习,比如性能优化、点击事件处理、ScrollView的区别等。</think>### HarmonyOS中ListContainer使用详解 ListContainer是HarmonyOS(鸿蒙系统)中实现高性能滚动列表的核心组件,采用基于视图复用的渲染机制实现流畅滚动体验[^1]。以下是具体实现步骤: #### 一、XML布局配置 ```xml <!-- listcontainer_layout.xml --> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:width="match_parent" ohos:height="match_parent"> <ListContainer ohos:id="$+id:list_container" ohos:width="match_parent" ohos:height="match_parent"/> </DirectionalLayout> ``` #### 二、创建数据适配器 ```java public class MyAdapter extends BaseItemProvider { private List<ItemData> dataList; private Context context; public MyAdapter(List<ItemData> list, Context context) { this.dataList = list; this.context = context; } @Override public int getCount() { return dataList.size(); } @Override public Object getItem(int position) { return dataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public Component getComponent(int position, Component convertView, ComponentContainer parent) { final Component component; if (convertView == null) { component = LayoutInflater.from(context).inflate( ResourceTable.Layout_list_item, null); } else { component = convertView; } // 数据绑定 Text itemText = (Text) component.findComponentById(ResourceTable.Id_item_text); itemText.setText(dataList.get(position).getContent()); return component; } } ``` #### 三、数据绑定初始化 ```java public class ListDemoAbility extends Ability { @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_listcontainer_layout); ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_list_container); // 准备数据源 List<ItemData> dataList = new ArrayList<>(); for (int i = 0; i < 100; i++) { dataList.add(new ItemData("Item " + i)); } // 设置适配器 MyAdapter adapter = new MyAdapter(dataList, this); listContainer.setItemProvider(adapter); } } ``` #### 四、性能优化要点 1. **视图复用机制**:通过`convertView`参数实现组件复用 2. **分页加载**:结合PageSlider实现分页加载大数据集 3. **异步加载**:使用`AsyncTask`处理耗时操作 4. **内存监控**:通过DevEco Studio的Profiler工具检测内存泄漏 #### 五、常见问题解决方案 1. **数据更新不刷新**:调用`notifyDataChanged()`方法 2. **空白项问题**:检查getCount()返回值和数据源一致性 3. **滚动卡顿**:优化getComponent()中的逻辑,避免复杂计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值