【C++】容器list的用法

本文详细介绍了如何使用C++中的STL库处理整型和字符数据,包括添加、遍历、累加、求最大元素等操作。
#include <iostream> 
#include <list> 
#include <numeric> 
#include <algorithm> 

using namespace std; 

//创建一个list容器的实例LISTINT 
typedef list<int> LISTINT; 

//创建一个list容器的实例LISTCHAR 
typedef list<int> LISTCHAR; 

void main(void) 
{ 
    //-------------------------- 
    //用list容器处理整型数据 
    //-------------------------- 
    //用LISTINT创建一个名为listOne的list对象 
    LISTINT listOne; 
    //声明i为迭代器 
    LISTINT::iterator i; 
    
    //从前面向listOne容器中添加数据 
    listOne.push_front (2); 
    listOne.push_front (1); 
    
    //从后面向listOne容器中添加数据 
    listOne.push_back (3); 
    listOne.push_back (4); 
    
    //从前向后显示listOne中的数据 
    cout<<"listOne.begin()--- listOne.end():"<<endl; 
    for (i = listOne.begin(); i != listOne.end(); ++i) 
        cout << *i << " "; 
    cout << endl; 
    
    //从后向后显示listOne中的数据 
    LISTINT::reverse_iterator ir; 
    cout<<"listOne.rbegin()---listOne.rend():"<<endl; 
    for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) { 
        cout << *ir << " "; 
    } 
    cout << endl; 
    
    //使用STL的accumulate(累加)算法 
    int result = accumulate(listOne.begin(), listOne.end(),0); 
    cout<<"Sum="<<result<<endl; 
    cout<<"------------------"<<endl; 
    
    //-------------------------- 
    //用list容器处理字符型数据 
    //-------------------------- 
    
    //用LISTCHAR创建一个名为listOne的list对象 
    LISTCHAR listTwo; 
    //声明i为迭代器 
    LISTCHAR::iterator j; 
    
    //从前面向listTwo容器中添加数据 
    listTwo.push_front ('A'); 
    listTwo.push_front ('B'); 
    
    //从后面向listTwo容器中添加数据 
    listTwo.push_back ('x'); 
    listTwo.push_back ('y'); 
    
    //从前向后显示listTwo中的数据 
    cout<<"listTwo.begin()---listTwo.end():"<<endl; 
    for (j = listTwo.begin(); j != listTwo.end(); ++j) 
        cout << char(*j) << " "; 
    cout << endl; 
    
    //使用STL的max_element算法求listTwo中的最大元素并显示 
    j=max_element(listTwo.begin(),listTwo.end()); 
    cout << "The maximum element in listTwo is: "<<char(*j)<<endl; 
} 

#include <iostream> 
#include <list> 

using namespace std; 
typedef list<int> INTLIST; 

//从前向后显示list队列的全部元素 
void put_list(INTLIST list, char *name) 
{ 
    INTLIST::iterator plist; 
    
    cout << "The contents of " << name << " : "; 
    for(plist = list.begin(); plist != list.end(); plist++) 
        cout << *plist << " "; 
    cout<<endl; 
} 

//测试list容器的功能 
void main(void) 
{ 
    //list1对象初始为空 
    INTLIST list1; 
    //list2对象最初有10个值为6的元素 
    INTLIST list2(10,6); 
    //list3对象最初有3个值为6的元素 
    INTLIST list3(list2.begin(),--list2.end()); 
    
    //声明一个名为i的双向迭代器 
    INTLIST::iterator i; 
    
    //从前向后显示各list对象的元素 
    put_list(list1,"list1"); 
    put_list(list2,"list2"); 
    put_list(list3,"list3"); 
    
    //从list1序列后面添加两个元素 
    list1.push_back(2); 
    list1.push_back(4); 
    cout<<"list1.push_back(2) and list1.push_back(4):"<<endl; 
    put_list(list1,"list1"); 
    
    //从list1序列前面添加两个元素 
    list1.push_front(5); 
    list1.push_front(7); 
    cout<<"list1.push_front(5) and list1.push_front(7):"<<endl; 
    put_list(list1,"list1"); 
    
    //在list1序列中间插入数据 
    list1.insert(++list1.begin(),3,9); 
    cout<<"list1.insert(list1.begin()+1,3,9):"<<endl; 
    put_list(list1,"list1"); 
    
    //测试引用类函数 
    cout<<"list1.front()="<<list1.front()<<endl; 
    cout<<"list1.back()="<<list1.back()<<endl; 
    
    //从list1序列的前后各移去一个元素 
    list1.pop_front(); 
    list1.pop_back(); 
    cout<<"list1.pop_front() and list1.pop_back():"<<endl; 
    put_list(list1,"list1"); 
    
    //清除list1中的第2个元素 
    list1.erase(++list1.begin()); 
    cout<<"list1.erase(++list1.begin()):"<<endl; 
    put_list(list1,"list1"); 
    
    //对list2赋值并显示 
    list2.assign(8,1); 
    cout<<"list2.assign(8,1):"<<endl; 
    put_list(list2,"list2"); 
    
    //显示序列的状态信息 
    cout<<"list1.max_size(): "<<list1.max_size()<<endl; 
    cout<<"list1.size(): "<<list1.size()<<endl; 
    cout<<"list1.empty(): "<<list1.empty()<<endl; 
    
    //list序列容器的运算 
    put_list(list1,"list1"); 
    put_list(list3,"list3"); 
    cout<<"list1>list3: "<<(list1>list3)<<endl; 
    cout<<"list1<list3: "<<(list1<list3)<<endl; 
    
    //对list1容器排序 
    list1.sort(); 
    put_list(list1,"list1"); 
    
    //结合处理 
    list1.splice(++list1.begin(), list3); 
    put_list(list1,"list1"); 
    put_list(list3,"list3"); 
}


<think>好的,用户现在问的是关于C++容器list的问题。让我先回想一下他们之前的对话历史。用户之前讨论过回调函数、Android NDK中的智能指针,还有关于传感器初始化的代码分析。现在他们转向C++list容器,可能是在开发过程中遇到了相关问题,或者在学习C++标准库。 首先,用户可能想知道list的基本用法,比如如何创建、添加元素、遍历等。但根据之前的模式,他们可能需要更深入的解释,包括底层实现、性能特点以及常见应用场景。比如,用户之前的问题涉及异步操作和资源管理,可能对list的内存管理或迭代器稳定性感兴趣。 接下来,我需要考虑如何组织回答。按照之前的格式,应该分点说明,包括核心概念、示例代码、底层实现、适用场景和注意事项。同时,要使用清晰的代码示例,可能包括基本操作、迭代器使用、与vector的对比等。 用户可能还关心list的优缺点,比如为什么选择list而不是vector或deque。这时候需要强调list的双向链表结构带来的插入删除效率,但随机访问较慢的特点。此外,可能涉及迭代器失效的问题,这在使用时需要注意。 另外,用户之前提到过Android开发,可能想知道list在实际项目中的使用案例,比如在管理传感器列表或异步任务中的应用。虽然用户这次的问题比较通用,但结合之前的背景,可能需要稍微提到这些应用场景。 还要注意用户可能的进阶问题,比如如何高效地合并两个list,或者如何处理list的线程安全。不过根据示例,相关问题通常集中在语法和常见实践上,所以需要准备几个相关问题,如迭代器使用、splice操作、内存管理等。 最后,确保代码示例正确,使用C++11或更高标准,可能包括auto关键字、范围for循环等现代C++特性,以符合当前开发实践。同时,注意代码中的注释,解释关键步骤,如内存泄漏预防和迭代器失效的情况。 总结:用户需要全面但简洁的list容器指南,涵盖基本用法、内部机制、适用场景及注意事项,辅以代码示例和相关问题,帮助他们正确应用在实际项目中。</think>C++中的`std::list`是标准模板库(STL)提供的双向链表容器,适合频繁插入/删除的场景。以下是核心知识点及示例: --- ### 1. **基本特性** - **双向链表结构**:每个元素包含前驱和后继指针,内存不连续。 - **动态扩容**:按需分配节点内存,无容量限制。 - **迭代器类型**:双向迭代器(支持`++`/`--`,但不支持随机访问)。 --- ### 2. **核心操作示例** ```cpp #include <iostream> #include <list> int main() { std::list<int> myList = {1, 2, 3}; // 插入元素(常数时间复杂度) myList.push_back(4); // [1,2,3,4] myList.push_front(0); // [0,1,2,3,4] // 删除元素 myList.remove(2); // 删除值为2的节点 [0,1,3,4] myList.pop_front(); // 删除首元素 [1,3,4] // 遍历访问 for (int x : myList) { std::cout << x << " "; // 输出:1 3 4 } // 插入迭代器位置 auto it = myList.begin(); std::advance(it, 2); // 移动到第三个元素前 myList.insert(it, 10); // [1,3,10,4] // 合并两个链表(需有序) std::list<int> otherList = {5, 6}; myList.merge(otherList); // [1,3,4,5,6,10](实际需排序后合并) return 0; } ``` --- ### 3. **底层实现原理** - **节点结构**:每个节点包含数据域、前驱指针和后继指针。 - **内存分配**:通过`allocator`按节点分配,可能导致内存碎片。 - **迭代器失效**:插入/删除操作不影响其他节点的迭代器。 --- ### 4. **典型应用场景** - **频繁插入/删除**:如实时数据流缓冲区。 - **排序队列**:如优先级任务调度(需手动维护顺序)。 - **实现栈/队列**:通过`push_front/pop_front`或`splice`操作。 --- ### 5. **注意事项** - **性能陷阱**:随机访问需遍历(时间复杂度O(n))。 - **内存泄漏预防**:避免裸指针存储,使用智能指针或值类型。 - **线程安全**:非线程安全,需外部同步机制保护。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值