目录
3-2-3, 添加元素(push_back | push_front)
C++中的一种容器类型, 也叫链表, 数据是链式存储的, 物理上不是一段连续的存储空间, 逻辑上通过链表指针来数据连接
list由节点组成, 节点由存储数据的数据域和存储地址的指针域组成
其迭代器不支持随机访问, 只能前移或后移
因为不是标准数据类型, 需要包含头文件才能使用#include
通过list<数据类型> 对象名, 可创建list, 数据类型可以是标准数据类型, 也可以是自定义类型
- //list中的元素类型为string
- list
l1;
- Myclass m1("aaa", 1);
- //list容器中的数据类型为Myclass
- list
l1;
- //通过拷贝构造创建
- list
l2(l1) ; - //通过迭代器区间方式创建
- list
l3(l1.begin(), l1.end()) ; - //list容器中的元素为5个m1
- list
l4(5, m1) ;
通过list<数据类型> 对象名2 = 对象名1, 进行赋值
- list
l1; - list
l2 = l1;
assign是用新的元素替换原来list的元素
- //l1中分配5个字符串对象aaa
- l1.assign(5, "aaa");
- //l1中用3个字符串bbb, 替换上面的5个aaa
- l1.assign(3, "bbb");
- Myclass m1("aaa", 1);
- Myclass m2("bbb", 2);
- list
l1; - //l1中的元素为5个m1对象
- l1.assign(5, m1);
- //l1的元素被替换为5个m2对象替换
- l1.assign(5, m2);
insert是向list指定位置, 添加元素, 支持一次添加多个元素
- //在l1.begin()迭代器指向位置, 插入元素aaa
- l1.insert(l1.begin(), "aaa");
- //在l1.begin()迭代器指向位置, 插入3个字符串bbb
- l1.insert(l1.begin(), 3, "bbb");
- //在l1.begin()迭代器指向位置, 插入区间:l1.begin(), l1.end()指向的元素
- l1.insert(l1.begin(), l1.begin(), l1.end());
- Myclass m1("aaa", 1);
- Myclass m2("bbb", 2);
- list
l1; - //在l1.begin()迭代器指向位置, 插入元素m1
- l1.insert(l1.begin(), m1);
- //在l1.begin()迭代器指向位置, 插入3个m2
- l1.insert(l1.begin(), 3, m2);
- //在l1.begin()迭代器指向位置, 插入区间:l1.begin(), l1.end()指向的元素
- l1.insert(l1.begin(), l1.begin(), l1.end());
push_back是在尾部插入元素, push_front是在头部插入元素, 两者都只能单个添加
- //在头部插入字符串元素bbb
- l1.push_front("bbb");
- //在尾部插入字符串元素aaa
- l1.push_back("aaa");
- Myclass m1("aaa", 1);
- Myclass m2("bbb", 2);
- list
l1; - //在头部插入元素m1
- l1.push_front(m1);
- //在尾部插入元素m1
- l1.push_back(m2);
由于list的数据不在连续内存空间上, 所以不支持索引访问
通过对象名.front()获取首元素, 对象名.back(), 获取尾元素, 通过迭代器, 获取指定元素
- //获取首元素
- cout << l1.front() << endl;
- //获取尾元素
- cout << l1.back() << endl;
- //通过迭代器获取元素
- list
::iterator it = l1.begin(); - it++;
- it++;
- cout << *it << endl;
- Myclass m1("aaa", 1);
- Myclass m2("bbb", 2);
- list
l1; - //在头部插入字符串元素bbb
- l1.push_front(m1);
- //在尾部插入字符串元素aaa
- l1.push_back(m2);
- //获取首元素
- cout << l1.front().m_name << " " << l1.front().m_age << endl;
- //获取尾元素
- cout << l1.back().m_name << " " << l1.back().m_age << endl;
- //通过迭代器获取
- list
::iterator it = l1.begin(); - it++;
- cout << it->m_name << " " << it->m_age << endl;
通过对象名.size(), 获取list的长度
cout << l1.size() << endl;
通过对象名.resize(), 设置list的长度
- //设置list的长度为5
- l1.resize(5);
- //设置list的长度为10, 多余为用m1填充
- l1.resize(10, m1);
通过对象名.empty(), 判断list是否为空, 为空返回1, 不为空返回0;
cout << l1.empty() << endl;
通过对象名.pop_front(), 删除list的头部元素
- //删除deque中的首元素
- l1.pop_front();
通过对象名.pop_back(), 删除list的尾部元素
- //删除deque中的尾元素
- l1.pop_back();
通过对象名.erase(迭代器名称), 删除迭代器指向的元素
- //删除指定的元素
- l1.erase(d.begin());
- list
::iterator it; - it++;
- l1.erase(it);
通过对象名.clear(), 删除迭代器指向的元素
- //通过迭代器指定区间进行清空
- l1.erase(l1.begin(), l1.end());
- //清空元素
- l1.clear()
- list
l1; - l1.push_back("ddd");
- l1.push_back("aaa");
- l1.push_back("ccc");
- l1.push_back("bbb");
- l1.sort();
通过对象名1.swap(对象名2), 可交换两个list中的元素, 元素类型需要一致
l1.swap(l2);
通过对象名.reverse(), 可翻转list中的元素
l1.reverse();