C++之std::list

2 篇文章 0 订阅
本文详细介绍了C++中的List容器,包括其构造与赋值、访问方式、添加、删除、迭代器使用以及优缺点。重点讲解了如何使用迭代器进行操作,并通过示例展示了List的实际应用。
摘要由CSDN通过智能技术生成

概念说明:

List是由双链表实现的一个容器,每个节点存储一个元素,支持前后两种移动方向。List的内存随着添加的节点增加而增加。数据在内存上存储是不连续的。

1、构造与赋值。

     list<int> nlist;//一个空的list

    list<int> nlist1(5, 3);//list大小为5,初始化的值为3

    list<int> nlist2(nlist1);//拷贝构造函数

    list<int> nlis3(9);//9个元素,默认为0

    list<int> nlis4(nlist2.begin(), nlist2.end());//区间拷贝赋值

list<int> nlis5 = nlis4;//重载等号赋值

auto itr = nlis5.begin();

*itr = 10;//单个元素修改赋值

2、访问方式。

通过迭代器访问:

for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)

        cout << *it << " ";   

3、添加

nlist.push_back(20);//尾部添加

    nlist.push_front(21);//头部添加

    nlist.insert(nlist.end(),30);//在指定位置插入一个数据

    nlist.insert(nlist.end(), nlist.begin(), nlist.end());//在指定数据插入区间数据,这相当复制了一份

4、删除

nlist.remove(21);//移除数据为21的节点

    nlist.erase(nlist.begin());//移除itr=begin的节点

    auto firt = nlist.begin();

    firt++;

    nlist.erase(firt, nlist.end());//删除区间数据

5、迭代器

begin()// 返回指向容器中第一个元素的双向迭代器。

end() // 返回指向容器中最后一个元素所在位置的下一个位置的双向迭代器。

rbegin()// 返回指向最后一个元素的反向双向迭代器。

rend()// 返回指向第一个元素所在位置前一个位置的反向双向迭代器。

cbegin()     // 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。

cend()//和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改素。

crbegin()   // 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。

crend()// 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。

6、其他函数

  1. resize(num,elem);//重置大小,若num小于目前大小,则删除后面数据,若大于目前大小,则扩大并且初始值elem.
  2. nlist.swap(nlis5);//两个容器交换
  3. nlist.reverse();//翻转数据
  4. nlist.sort();//排序,默认从小到大
  5. nlist.merge(nlis5);//合并,两个容器必须是有序的,不然会崩溃
  6. auto iter = std::find(nlist.begin(), nlist.end(), 80);//查找元素,返回迭代器

7、优缺点

优点:高效的插入和删除元素。采用动态内存,不会造成内存浪费和溢出。插入操作和删除操作都不会造成原有list 迭代器的失效,这在vector是不成立的

缺点:遍历速度没有数组容器大快,并且占用空间较大(因为链表的指针)。不支持下标访问。

8、例子程序

#include <iostream>

#include<list>

#include<algorithm>

using namespace std;

void printList(const list<int>& L)

{

    for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)

    {

        cout << *it << " ";

    }

    cout << endl;

}

int main()

{

    list<int> nlist;//一个空的list

    list<int> nlist1(5, 3);//list大小为5,初始化的值为3

    list<int> nlist2(nlist1);//拷贝构造函数

    list<int> nlis3(9);//9个元素,默认为0

    list<int> nlis4(nlist2.begin(), nlist2.end());//区间拷贝赋值

    list<int> nlis5 = nlis4;//重载等号赋值

    auto itr = nlis5.begin();

    *itr = 10;//单个元素修改赋值

    nlist.push_back(20);//尾部添加

    nlist.push_front(21);//头部添加

    nlist.insert(nlist.end(),30);//在指定位置插入一个数据

    nlist.insert(nlist.end(), nlist.begin(), nlist.end());//在指定数据插入区间数据,这里相当复制了一份

    cout << "添加操作" << endl;;

    printList(nlist);

    nlist.remove(21);//移除数据为21的节点

    nlist.erase(nlist.begin());//移除itr=begin的节点

    auto firt = nlist.begin();

    firt++;

    nlist.erase(firt, nlist.end());//删除区间数据

    cout << "删除操作" << endl;;

    printList(nlist);

    nlist.clear();

    for (int i = 5; i < 16; i++)

        nlist.push_back(i);

    nlist.resize(10, 33);//重置大小

    nlist.reverse();//翻转数据

    cout << "翻转" << endl;;

    printList(nlist);

    nlist.swap(nlis5);//两个容器交换

    nlist.sort();//排序,默认从小到大

    cout << "排序" << endl;;

    printList(nlist);

    nlis5.sort();

    nlist.merge(nlis5);//合并,两个容器必须是有序的,不然会崩溃

    auto iter = std::find(nlist.begin(), nlist.end(), 80);//查找元素,返回迭代器

    printList(nlist);

  

   

    getchar();

}

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: c++中的std::initializer_list是一个类模板,用于创建一个初始化器列表,它可以用来初始化标准容器或特定的自定义类对象。\[2\]它的底层机制是指针空间,类似于一个存放了一堆元素的列表。\[2\]你可以使用std::initializer_list来遍历列表中的元素,通过使用begin()和end()函数来获取指向首元素和末尾元素后一位置的指针,然后使用循环来遍历列表中的元素。\[1\]例如,你可以使用for循环来遍历一个std::initializer_list<int>对象,并使用*it来访问每个元素。\[2\]另外,你也可以使用size()函数来获取初始化器列表中元素的数量。\[3\] #### 引用[.reference_title] - *1* *3* [C++中的std::initializer_list详解](https://blog.csdn.net/weixin_43165135/article/details/127927352)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [现代C++std::initializer_list的特性分析](https://blog.csdn.net/a574780196/article/details/122493579)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值