C++之std::list

概念说明:

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();

}

相关推荐
额,不知道写啥。3 分钟前
P5314 ODT(毒瘤树剖)
数据结构·c++·算法
Once_day9 分钟前
GCC编译(4)构造和析构函数
c语言·c++·编译和链接
今儿敲了吗10 分钟前
24| 字符串
数据结构·c++·笔记·学习·算法
橘色的喵19 分钟前
嵌入式 Telnet 调试 Shell 重构: 纯 POSIX 轻量化实现
c++
橘色的喵19 分钟前
ztask: 一个C++14编写的、 类型安全、RAII 与模板化任务调度器
c++
小龙报33 分钟前
【51单片机】不止是调光!51 单片机 PWM 实战:呼吸灯 + 直流电机正反转 + 转速控制
数据结构·c++·stm32·单片机·嵌入式硬件·物联网·51单片机
彩妙不是菜喵36 分钟前
C++:深入浅出讲解=>多态
开发语言·c++
lightqjx2 小时前
【C++】C++11 - Lambda表达式+包装器
开发语言·c++·c++11·lambda·包装器
载数而行5202 小时前
算法系列1之最小生成树
c语言·数据结构·c++·算法·贪心算法
额,不知道写啥。2 小时前
HAO的DP
c++·算法·深度优先·动态规划