【STL基础】list

list

构造函数:


//default:
list<T> l; //空的list

//fill:
list<T> l(n); //n个元素, 元素默认初始化
list<T> l(n, value); //n个元素值为value

//range:
list<T> l(first, last); //两个迭代器之间的元素构成
list<T> l(arr, arr + sizeof(arr) / sizeof(T)); //由内置数组构造

//copy:
list<T> l(const list<T> &t); //v是u的拷贝

//move:
list<T> l(list<T> &&x); //x是右值引用(只能引用右值,如list<int> &&x = {1,2,3};)

//initializer list:
list<T> l{value1, value2...};

赋值与swap:

l1 = l2;
l1 = { 1, 2, 3 };
l1.swap(l2);
swap(l1, l2);

大小:

size_type l.size() const noexcept;    //元素数目
size_type l.max_size() const noexcept; //可容纳元素的最大数目
bool l.empty() //是否为空
l.resize(n);
l.resize(n, value);

获取元素:

l.front();    //首元素
l.back(); //尾元素

修改:


//assign
l.assign(n, value); //将v置为n个值为value的元素
l.assign(first, last); //用t的两个迭代器之间的值为l赋值,左闭右开 t可以是vector、array、list、forward_list、deque、set、unordered_set、multiset、unordered_multiset等。 元素的顺序和重复性由传入的容器类型性质决定
l.assign(begin(t), end(t)); //与上条语句类似,除上述类型,还支持内置数组类型
l.assign(arr, arr + n); //将数组中的一部分赋给l
l.assign({value1, value2...}); //列表

l.push_back(value); //尾部插入一个元素
l.push_front(value); //首部插入一个元素
l.pop_back(); //删除最后一个元素
l.pop_front(); //删除第一个元素

//insert
l.insert(it, value); //迭代器指向的位置插入值为value的元素
l.insert(it, n, value); //迭代器指向的位置插入n个值为value的元素
l.insert(it, first, last); //迭代器it指向的位置插入另一个容器的两个迭代l之间的元素
l.insert(it, x); //x是T的右值引用 T&&
l.insert(it, {value1, value2...}); //列表
//以上函数返回一个指向新插入的第一个元素的迭代器

//emplace(C++11)
l.emplace(it, args); //以args为参数,调用T的构造函数构造一个对象插入it所指的位置
l.emplace_back(args); //将构造的T对象插入尾部
l.emplace_front(args); //插入前端
//以上函数返回一个指向新插入的元素的迭代器

//erase
l.erase(it); //删除it指向的元素
l.erase(first, last); //删除范围内的元素
//以上函数返回一个迭代器,指向被删除的最后一个元素之后的元素

l.clear(); //删除所有元素

修改:


//splice
l.splice(it, x);
l.splice(it, x, itx); //x为引用或右值引用,将x的内容拼接到it指向的位置处. 该过程不包括构造和析构过程,而是元素的转移。如果给定itx则是转移x中itx指向的元素
l.splice(it, first, last);

list<int> l1 {1,2,3};
list<int> l2 {10, 20, 30};
l1.splice(l1.begin(), l2); //l1: 1, 10, 20, 30, 2, 3

l.remove(value); //删除所有等于value的元素
l.remove_if(pred);

// list::remove_if
#include <iostream>
#include <list>

// a predicate implemented as a function:
bool single_digit (const int& value) { return (value<10); }
// a predicate implemented as a class:
struct is_odd {
bool operator() (const int& value) { return (value%2)==1; }
};
int main ()
{
int myints[]= {15,36,7,17,20,39,4,1};
std::list<int> mylist (myints,myints+8); // 15 36 7 17 20 39 4 1
mylist.remove_if (single_digit); // 15 36 17 20 39
mylist.remove_if (is_odd()); // 36 20return 0;
}

l.unique();
l.unique(binary_pred);
#include <iostream>
#include <cmath>
#include <list>

// a binary predicate implemented as a function:
bool same_integral_part (double first, double second)
{ return ( int(first)==int(second) ); }
// a binary predicate implemented as a class:
struct is_near {
bool operator() (double first, double second)
{ return (fabs(first-second)<5.0); }
};
int main ()
{
double mydoubles[]={ 12.15, 2.72, 73.0, 12.77, 3.14,
12.77, 73.35, 72.25, 15.3, 72.25 };
std::list<double> mylist (mydoubles,mydoubles+10);

mylist.sort(); // 2.72, 3.14, 12.15, 12.77, 12.77,
// 15.3, 72.25, 72.25, 73.0, 73.35
mylist.unique(); // 2.72, 3.14, 12.15, 12.77
// 15.3, 72.25, 73.0, 73.35
mylist.unique (same_integral_part); // 2.72, 3.14, 12.15
// 15.3, 72.25, 73.0
mylist.unique (is_near()); // 2.72, 12.15, 72.25return 0;
}

l.merge(x);
l.merge(x, comp);
// list::merge
#include <iostream>
#include <list>
// compare only integral part:
bool mycomparison (double first, double second)
{ return ( int(first)<int(second) ); }
int main ()
{
std::list<double> first, second;
first.push_back (3.1);
first.push_back (2.2);
first.push_back (2.9);
second.push_back (3.7);
second.push_back (7.1);
second.push_back (1.4);
first.sort();
second.sort();
first.merge(second);
// (second is now empty)
second.push_back (2.1);
first.merge(second,mycomparison);
std::cout << "first contains:";
for (std::list<double>::iterator it=first.begin(); it!=first.end(); ++it)
std::cout << ‘ ‘ << *it;
std::cout << ‘\n‘;
return 0;
}
//first contains: 1.4 2.2 2.9 2.1 3.1 3.7 7.1

l.sort();
l.sort(comp);
bool compare_nocase (const T &first, const T &second);

l.reverse();

获取迭代器:


l.begin(), l.end();    //首元素位置,尾后位置
l.cbegin(), l.cend(); //const_iterator

//reverse_iterator 按逆序寻址
//const_reverse_iterator
l.rbegin(), l.rend();
l.crbegin(), l.crend();

begin(l), end(l);

【STL基础】list

时间: 2024-10-21 05:15:53

【STL基础】list的相关文章

【STL基础】deque

deque (double-ended queue) 构造函数: //default: deque<T> d; //空的vector //fill: deque<T> d(n); //n个元素的deque,元素默认初始化 deque<T> d(n, value); //n个元素值为value的deque //range: deque<T> d(first, last); //两个迭代器之间的元素构成的deque deque<T> d(arr, a

C++ STL 基础及应用(6) 容器

读者可能有这样的经历,自己编写了动态数组类.链表类.集合类和映射类等程序,然后小心地维护着.其实 STL 提供了专家级的几乎我们所需要的各种容器,功能更好,效率更高,复用性更强,所以开发应用系统应该首选 STL 容器类,摒弃自己的容器类,尽管它可能花费了你很多的开发时间. 本章将介绍 STL 中的通用容器 包括 vector.deque.list.queue和stack.priority_queue.bitset.set和multiset.map和multimap等等. 概述 容器分类 (1)序

C++ STL 基础及应用(3) 迭代器

迭代器(Iterator)是 STL 的核心技术,提供了统一访问容器元素的方法,为编写通用算法提供了坚实的技术基础. 本章将带你编写一个自带迭代器的数组类和一个自带迭代器的链表类,模拟 STL 中的容器,这两个实例能够很清晰地展示 STL 的迭代器思想.并探讨迭代器类应该作为容器类的内部类的原因,然后对 STL 迭代器做一下归纳理解,最后阐述一下 STL 中真正的迭代器概况. 那么什么是迭代器呢? 迭代器即指针,可以是需要的任意类型,它的最大好处是可以使容器和算法分离.例如,有两个容器类,MyA

c++中级 STL基础学习(二)

deque 和vector差不多,可以在前端后端插入,一般用deque取代vector,vector只能在后端插入push_back().deque还可以push_front(). list:双向链表,不能使用下标,和数组vector deque不同.只能使用迭代器,来指示元素.push_front,push_back,insert(位置,值),位置一般用迭代器来指定位置,其中insert返回的是一个迭代器.例如lis.insert(a.begin, 12);返回的是一个迭代器.删除使用eras

C++ STL 基础及应用(7) 函数对象(仿函数)

把函数作为对象是程序设计的新思维.STL 通过重载类中的 operator() 函数实现函数对象功能,不但可以对容器中的数据进行各种各样的操作,而且能够维护自己的状态.因此,与标准 C 库函数相比,函数对象更为通用. 本章将介绍函数指针的使用.函数对象的定义.引入目的.使用方法,C++98 标准和C++11标准下 STL 内置函数对象的详细介绍.适配器类的使用.包括 bind1st bind2nd not1 not2 mem_fun mem_fun_ref ptr_fun bind ref cr

C++ STL 基础及应用(2) 模板与操作符重载

本章将阐述一些具体的 STL 模板思想,并简单介绍操作符重载与模板的联系. 模板是 C++ 语言中重要的概念.它提供了一种通用的方法来开发重用的代码,即以创建参数化的 C++ 类型.模板分为两种类型:函数模板和类模板.函数模板的用法同 C++ 预处理器的用法有一定的类似之处,它们都提供编译代码过程中的文本替换功能,但函数模板还能对类型进行一定的保护.使用类模板可以编写通用的.类型安全的类. 1.编写一个数组元素求和的函数模板. #include <iostream> using namespa

C++STL基础知识

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库. 它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分.该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性.这种现象有些类似于Microsoft Visual C++中的MFC(Microsoft Foundati

STL基础--基本介绍

为什么要使用C++标准库 /* * 为什么使用C++标准库: * 1. 代码重用,不用重新造轮子 * 2. 效率(快速,且使用更少的资源). 现代C++编译器经常对C++标准库的代码有优化 * 3. 准确,更少的bug * 4. 简洁,可读性好:减少控制流 * 5. 标准化,保证可用 * 6. 是编写库的一个很好的榜样 * 7. 对数据结构和算法有更好的认识 */ /* * STL: Standard Template Library * -- 容器和算法,迭代器是容器和算法之间的桥梁,使容器和

STL基础--容器

容器种类 序列容器(数组,链表) Vector, deque, list, forward list, array 关联容器(二叉树),总是有序的 set, multiset根据值排序,元素值不能修改 map, multimap根据key排序,键值不能修改 无序容器(hash 表) 无序set/multiset 无序map/multimap 序列容器 Vector vector<int> vec; // vec.size() == 0 vec.push_back(4); vec.push_ba