STD::list使用说明

STL 中的list 就是 双向链表,可高效地进行插入删除元素。list不支持随机访问。所以没有 at(pos)和operator[]

list成员

说明

constructor

构造函数

destructor

析构函数

operator=

赋值重载运算符

assign

分配值

front

返回第一个元素的引用

back

返回最后一元素的引用

begin

返回第一个元素的指针(iterator)

end

返回最后一个元素的下一位置的指针

rbegin

返回链表最后一元素的后向指针(reverse_iterator or const)

rend

返回链表第一元素的下一位置的后向指针

push_back

增加一元素到链表尾

push_front

增加一元素到链表头

pop_back

pop_back()删除链表尾的一个元素

pop_front

删除链表头的一元素

clear

删除所有元素

erase

删除一个元素或一个区域的元素(两个重载)

remove 

删除链表中匹配值的元素(匹配元素全部删除)

remove_if

删除条件满足的元素(遍历一次链表),参数为自定义的回调函数

empty

判断是否链表为空

max_size

返回链表最大可能长度

size

返回链表中元素个数

resize

重新定义链表长度(两重载函数)

reverse

反转链表

sort 

对链表排序,默认升序

merge

合并两个有序链表并使之有序

splice 

对两个链表进行结合(三个重载函数) 结合后第二个链表清空

insert

在指定位置插入一个或多个元素(三个重载函数)

swap

交换两个链表(两个重载)

unique 

删除相邻重复元素 


1.list 构造函数

list <int > L0 ;        // 空链表

list <int > L1 (9);    // 建一个含个默认值是的元素的链表

list <int > L2 (5,1); // 建一个含个元素的链表,值都是

list <int > L3 (L2 );  // 建一个L 2  copy 链表

list <int > L4 (L0 .begin (), L0 .end ());// 建一个含 L0 一个区域的元素

 

2. assign() 分配值,有两个重载

L1. assign ( 4,3);                                // L1(3,3,3,3)

L1. assign( ++list1.beging(), list2.end());   // L 1(2,3)

 

3  operator= 赋值重载运算符

L1 = list1;   // L1 (1,2,3)

 

4.   front() 返回第一个元素的引用

int nRet = list1.front()    // nRet = 1

 

5.   back() 返回最后 元素的引用

int nRet = list1.back()     // nRet = 3

 

6.   begin() 返回第一个元素的指针(iterator)

it = list1.begin();    // *it = 1

 

7.     end() 返回最后一个元素的 下一位置 的指针(list 为空时end()=begin())

it = list1.end();

--it;                       // *it = 3

 

8.rbegin() 返回链表最后 元素的后向指针(reverse_iterator or const)

list <int >::reverse_iterator it = list1 .rbegin ();  // *it = 3

 

9.      rend() 返回链表第一元素的 下一位置 的后向指针

list< int>::reverse_iterator it = list1 .rend(); // *(--riter) = 1

 

10.push_back() 增加 元素到链表尾

list1.push_back( 4)       // list1(1,2,3, 4 )


11.   push_front() 增加 元素到链表头

list1.push_front( 4)      // list1( 4 ,1,2,3)

 

12.   pop_back() 删除链表尾的一个元素

list1.pop_back( )          // list1(1,2)

 

13.pop_front() 删除链表头 的 元素

list1.pop_front()           // list1(2,3)

 

14 clear() 删除所有元素

list1.clear();   // list1 空了,list1.size() = 0

 

15.erase() 删除 一个元素  一个区域的元素 ( 两个重载函数)

list1.erase( list1.begin());                // list1(2,3)

list1.erase( ++list1.begin(),list1.end()); // list1(1)

 

16.       remove() 删除链表中匹配值 的元素( 匹配元素全部删除)

list 对象L1( 4 ,3,5,1, 4 )

L1.remove( 4);               // L1(3,5,1);

 

17.remove_if() 删除条件满足的元素( 遍历一次链表) ,参数为自定义的回调函数

// 小于2 的值删除

bool myFun (const int & value ) { return (value < 2); }

list1.remove_if( myFun );    // list1(3)  

 

18.empty() 判断是否链表为空

bool bRet = L1.empty(); // L1 为空,bRet = true ,否则bRet = false 。

 

19.max_size() 返回链表最大可能长度

list <int >::size_type nMax = list1 .max_size ();// nMax = 1073741823

 

20 size() 返回链表中元素个数

list< int>::size_type nRet = list1.size();      // nRet = 3

 

21.resize() 重新定义链表长度( 两重载函数)

list1.resize(5)    // list1 (1,2,3, 0,0 ) 用默认值填补

list1.resize(5,4)    // list1 (1,2,3, 4,4 ) 指定值 填补

 

22.reverse() 反转链表:

list1.reverse( );     // list1(3,2,1)

 

23.sort() 对链表排序,默认升序( 可自定义回调函数 )

list 对象L1(4,3,5,1,4)

 

L1.sort( );                 // L1(1,3,4,4,5)

L1.sort( greater <int >() ); // L1(5,4,4,3,1)

 

24.merge() 合并两个有序链表并使之有序

// 升序

list1.merge(list2);          // list1(1,2,3,4,5,6) list2 现为空

// 降序

L1( 3,2,1), L2(6,5,4)

L1.merge(L2, greater <int >() ); // list1(6,5,4,3,2,1) list2 现为空

 

25.splice() 对两个链表进行结合( 三个重载函数) 结合后第二个链表清空

list1.splice( ++list1.begin(),list2); 

// list1(1,4,5,6,2,3) list2 为空

  list1.splice( ++list1.begin(),list2,list2.begin());

// list1( 1,4,2,3); list2(5,6)

list1.splice( ++list1.begin(),list2,++list2.begin(),list2.end());

//list1( 1, 5,6, 2,3); list2(4)

 

26.insert() 在指定位置插入一个或多个元素( 三个重载函数)

list1.insert( ++list1.begin(),9);  // list1(1,9,2,3)

list1.insert(list1.begin(),2,9);  // list1(9,9,1,2,3);

list1.insert(list1.begin(),list2.begin(),--list2.end());//list1(4,5,1,2,3);

 

27.swap() 交换两个链表( 两个重载)

list1.swap(list2);   // list1 4 ,5 ,6 ) list2 (1 ,2 ,3 )

 

28.   unique() 删除相邻重复元素

L1( 1, 1 ,4,3,5,1)

L1.unique( );         // L1(1,4,3,5,1)

 

bool same_integral_part (double first , double second )

return ( int (first )==int (second ) ); }

L1.unique( same_integral_part );



<think>好的,用户想了解如何在C++使用std::list及其常见操作方法。首先,我需要回忆std::list的基本特性。std::listC++标准模板库(STL)中的一个双向链表容器,支持高效的插入和删除操作,尤其是在任意位置。不过,它的随机访问效率较低,因为需要从头或尾开始遍历。 接下来,我应该整理std::list的主要用法。首先是创建和初始化list对象。用户可能需要知道如何声明一个list,以及使用构造函数或初始化列表来初始化元素。例如,使用默认构造函数创建空列表,或者用另一个列表的元素来初始化。参考引用[1]提到可以使用构造函数初始化,这一点需要包含进去。 然后是插入和删除元素的操作。常用的方法包括push_back、push_front、pop_back、pop_front,还有insert和erase。需要详细说明这些方法的用法,比如insert需要迭代器指定位置,erase同样需要迭代器,并且要注意迭代器失效的问题。可能还需要提到emplace方法,C++11引入的原地构造,提高效率。 遍历list也是一个重点。用户需要知道如何用迭代器或者范围for循环来遍历元素。这里要强调std::list不支持随机访问,所以不能使用下标运算符,必须用迭代器逐步访问。例如,使用begin()和end()获取迭代器,或者cbegin()和cbegin()获取常量迭代器。 另外,其他常用操作包括获取大小(size)、检查是否为空(empty)、调整大小(resize)、排序(sort)和合并(merge)。特别是sort方法,因为std::list有自己的sort成员函数,比通用算法std::sort更高效,因为它可以利用链表的结构优势。需要提醒用户注意这一点。 还要注意性能方面的考虑。比如,插入和删除操作的时间复杂度是O(1),但查找需要O(n)。因此,在需要频繁插入删除但不常随机访问的场景下,使用list更合适。引用[1]中提到了避免常见陷阱,可能包括正确管理迭代器和理解操作的时间复杂度。 用户的问题可能还涉及实际应用示例,所以提供一个简单的代码示例会有帮助。比如创建一个list,插入元素,遍历输出,然后删除元素,最后排序。这样用户可以看到基本操作的连贯使用。 最后,根据用户提供的引用,引用[1]详细介绍了std::list的用法,包括创建、插入删除、遍历等,需要确保覆盖这些点,并在适当的地方添加引用标识。例如,在提到构造函数初始化时引用[2]提到的其他初始化方法,但用户主要关注list,所以重点在引用[1]。 现在需要检查是否遗漏了重要操作,比如splice、reverse等,但常见操作可能已经覆盖。确保语法正确,特别是代码示例中的类型和函数名正确,比如std::list<int>和使用成员函数sort()。 生成相关问题部分需要考虑用户可能进一步想了解的内容,比如性能分析、优化方法、应用场景,与vector的对比,迭代器失效问题,以及高级操作如合并和拼接。这些问题有助于用户深入学习和应用std::list。</think>在C++使用$std::list$需要包含头文件$<list>$,它是基于双向链表实现的容器,支持高效插入/删除操作但随机访问效率较低。以下是具体用法说明: ### 一、创建list对象 1. 默认构造函数创建空列表: ```cpp std::list<int> list1; ``` 2. 指定元素数量和初始值: ```cpp std::list<std::string> list2(5, "tmp"); // 包含5个"tmp" ``` 3. 通过迭代器范围初始化: ```cpp int arr[] = {9,2,5}; std::list<int> list3(arr, arr+3); ``` ### 二、插入与删除操作 1. 头尾操作: ```cpp list1.push_back(10); // 尾部插入 list1.push_front(3); // 头部插入 list1.pop_back(); // 删除尾部 list1.pop_front(); // 删除头部 ``` 2. 指定位置插入: ```cpp auto it = list1.begin(); list1.insert(++it, 8); // 在第二个位置插入8 list1.emplace(it, 7); // 原地构造(C++11) ``` 3. 删除元素: ```cpp list1.erase(it); // 删除迭代器指向元素 list1.remove_if([](int x){ return x%2 == 0; }); // 删除偶数 ``` ### 三、遍历方法 1. 迭代器遍历: ```cpp for(auto it = list1.begin(); it != list1.end(); ++it) { std::cout << *it << " "; } ``` 2. 范围for循环(C++11): ```cpp for(const auto& val : list1) { std::cout << val << " "; } ``` ### 四、其他常用操作 1. 容量查询: ```cpp if(!list1.empty()) { std::cout << "元素数量:" << list1.size(); } ``` 2. 排序与合并: ```cpp list1.sort(); // 升序排序 list2.sort(); list1.merge(list2); // 合并有序列表 ``` 3. 去重操作: ```cpp list1.unique(); // 删除连续重复值 ``` ### 五、代码示例 ```cpp #include <iostream> #include <list> int main() { std::list<int> nums{7,5,9,3}; nums.push_front(2); nums.remove(5); for(auto& x : nums) { x *= 2; } nums.sort(); return 0; } ``` ### 六、应用建议 $std::list$适合需要频繁在任意位置插入/删除元素的场景,如实现LRU缓存[^1]。但要注意其迭代器在插入后仍有效,删除时只有被删元素的迭代器失效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值