STL:list

#首先包含头文件:

#include <list>

using namespace std;//需要使用该命名空间

list是一个双向链表,是不支持随机存取的。

 

#然后定义对象:

list<int>     m_list;

定义一个int型的双向list链表。

 

#输入元素:

m_list.push_back(8);

m_list.push_back(9);

m_list.push_front(1);

m_list.push_front(0);

push_back()用于向list的末尾添加元素,push_front()用于向list的开头添加元素。

上面的操作存入m_list中的结果是:{0,1,8,9}

 

#删除元素:

m_list.pop_front();

m_list.pop_back();

pop_front()用于删除list中的第一个元素,pop_back()用于删除list中的最后一个元素。

这两个函数的返回值都是void,也就是说这两个函数仅用于删除操作。

操作要求序列必须不为空。

 

#获取指向list元素的迭代器:

list<int>::iterator    m_listIterator;

这样就定义了一个该list类型的迭代器。可以将list的任意元素的迭代器直接赋值给它。

 

#访问list中的元素:

定义一个同类型的迭代器:

list<int>::iterator    m_listIterator;

该迭代器是个指针

已知m_list中有4个元素,按顺序是:{0,1,8,9}

    list的起始元素:

m_listIterator     = m_list.begin();

cout<<*m_listIterator<<endl;     //输出m_list的起始元素,即0号元素

输出结果是:0

    list的下一个元素:

m_listIterator++;

cout<<*m_listIterator<<endl;     //输出m_list的1号元素

输出结果是:1

注意iterator可以使用++以及--,但却不能使用+=-=,也不能使用iterator = iterator+1这样的形式。原因是不支持随机存取。参见下面

③      list的最后一个元素的下一个位置:

m_listIterator     = m_list.end();

注意这与back()是不同的。该位置指向的是back()的下一个位置。所以该位置是没有元素的。

④      list的最后一个元素:

cout<<m_list.back()<<endl;     //输出m_list的3号元素

输出结果是:9

注意back()函数返回的是个引用,而非iterator指针。

⑤      list的第n个元素:

m_listIterator     = m_list.begin();

for (size_ti=0;i<m_list.size();i++)

{

     if(i ==n)

     {

         break;

     }

     m_listIterator++;

}

cout<<*m_listIterator<<endl;     //输出m_list第n个元素

由于list是个双向链表,不支持随机存取,所以要直接定位到第n个元素的位置是不可能的,只能一个元素一个元素地加过去。

 

#查找list中值为k的元素:

m_listIterator= std::find(m_list.begin(),m_list.end(),k);

其中m_list.begin()m_list.end()限定了list的查找区间。

std::find只用于查找容器元素为         基本元素

std::find_if用于查找容器元素为          

注意要调用该find函数需要包含头文件:#include<algorithm>

 

#删除list中的值为k的元素:

m_list.remove(k);

remove()会将list中值为k的元素全部删除,该函数只用于基本元素。

若要删除满足某种条件的元素,则调用remove_if()

 

#清空list中的元素:

m_list.clear();

 

# list中元素的个数:

m_list.size();

 

# list是否为空:

m_list.empty();

 

# list排序:

m_list.sort();

直接这样调用即可。默认升序排序,即排序函数是运算符“<”。可以通过修改排序函数pr来自定义排序方式。

 

# list最长序列长度:

m_list.max_size();

list不是可以无限存储数据的。每个list对象有自己所能控制的最大长度。

 

#交换两个list对象:

list<int>     listT;

m_list.swap(listT);

交换后,m_list将拥有listT的所有元素,listT将拥有m_list的所有元素。

 

#合并两个list对象:

list<int>     listT;

m_list.merge(listT);

合并后,m_listlistT的所有元素会按升序排序,然后存储到m_list中。listT将被清空。

### 三级标题:C++ STL list 容器的遍历方法 C++ 中的 `std::list` 是一个双向链表结构,其迭代器支持正向和反向遍历。为了实现对 `list` 容器的遍历,通常使用 `begin()` 和 `end()` 方法获取起始和结束位置的迭代器,并通过递增操作依次访问每个元素。 以下是一个基本的 `list` 遍历示例: ```cpp #include <iostream> #include <list> using namespace std; int main() { list<int> myList = {1, 2, 3, 4, 5}; // 使用迭代器遍历 list for (list<int>::iterator it = myList.begin(); it != myList.end(); ++it) { cout << *it << " "; } cout << endl; return 0; } ``` 上述代码中展示了如何使用 `list<int>::iterator` 类型声明迭代器并对其进行递增操作以访问 `list` 中的所有元素[^1]。 此外,也可以使用 C++11 引入的 `auto` 关键字来简化迭代器类型的声明过程: ```cpp for (auto it = myList.begin(); it != myList.end(); ++it) { cout << *it << " "; } ``` 除了正向遍历之外,还可以使用反向迭代器(reverse iterator)从后往前访问容器中的元素: ```cpp // 使用反向迭代器遍历 list for (auto rit = myList.rbegin(); rit != myList.rend(); ++rit) { cout << *rit << " "; } cout << endl; ``` 这种方法允许以逆序方式处理 `list` 容器中的元素,这在某些特定的应用场景下非常有用[^4]。 ### 三级标题:插入与修改元素时的注意事项 当遍历 `list` 容器的同时需要修改容器内容时,应当特别小心。例如,在遍历过程中插入或删除元素可能会使当前迭代器失效,从而导致未定义行为。因此,在执行此类操作前应确保了解所使用的 STL 实现是否支持这样的操作。 如需在遍历期间插入新元素,可以参考如下做法: ```cpp list<int>::iterator itStart = myList.begin(); myList.insert(itStart, 5, 9); // 在 begin() 位置前插入五个 9 ``` 此段代码演示了如何利用 `insert` 方法在指定位置之前插入多个相同值的元素[^3]。 ### 三级标题:总结 综上所述,`std::list` 提供了灵活的迭代机制来支持各种遍历需求,包括但不限于正向遍历、反向遍历等。正确使用这些特性不仅能够提高程序效率,还能增强代码可读性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值