C++容器之list

简介

         List是一种可在常数时间内在任何位置执行插入和删除操作的顺序容器。list是双向链表,其迭代器是双向的。与其他顺序容器(array, vector, deque)相比,list容器在任意位置执行插入、提取、和移动元素的操作更高效,但它不能通过在容器中的位置直接获取元素。

成员函数


复制控制


list::list()

         构造函数:构造一个新的list对象,根据参数初始化list容器的内容。

list::~list()

         析构函数:销毁以list对象。

list::operator=

         为容器分配新的内容,代替当前的内容,随之修改其大小。

示例代码

#include<iostream>
#include<list>
 
using namespace std;
 
void
print(list<int> l)
{
    for(list<int>::iterator it = l.begin(); it != l.end(); ++it)
    {
       cout << *it << "";
    }
    cout << endl;
}
 
int
main(void)
{
    // list::list()
    list<int> first;
    list<int> second(5, 10);
    list<int> third(second.begin(), second.end());
    list<int> fourth(third);
    int arr[] = {1, 2, 3, 4, 5};
    list<int> fifth(arr, arr + sizeof(arr)/sizeof(int));
    print(second);
    print(third);
    print(fourth);
    print(fifth);
   
    // list::operator=
    first = fifth;
    print(first);
   
    return(0);
}

Iterator


list::begin()

         返回一个迭代器,指向list的第一个元素。返回值类型:iterator/const_iterator。

list::end()

         返回一个迭代器,指向list的最后一个元素的下一个位置。返回值类型:iterator/const_iterator。

list::rbegin()

        返回一个反转迭代器,指向list的最后一个元素。返回值类型:reverse_iterator/reverse_const_iterator。

list::rend()

         返回一个反转迭代器,指向list的第一个元素的前一个位置。返回值类型:reverse_iterator/reverse_const_iterator。

list::cbegin()

         begin()的const版本。

list::cend()

         end()的const版本

list::crbegin()

         rbegin()的cosnt版本。

list::crend()

         rend()的const版本。

示例代码

#include <iostream>
#include <list>

using namespace std;

int
main(void)
{
	int arr[] = {1, 2, 3, 4, 5};
	list<int> l(arr, arr + sizeof(arr)/sizeof(int));
	
	// list::begin end
	for(list<int>::iterator it = l.begin(); it != l.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	// list::rbegin rend
	for(list<int>::reverse_iterator it = l.rbegin(); it != l.rend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	// list::cbegin cend
	for(list<int>::const_iterator it = l.cbegin(); it != l.cend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	// list::cbegin cend
	for(list<int>::const_reverse_iterator it = l.crbegin(); it != l.crend(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
	
	return 0;
}

Capacity


list::empty()

         测试list是否为空,空返回true,否则返回false。

list::size()

         返回list中元素个数。返回值类型list::size_type。

list::max_size()

         返回list能够容纳元素的最大个数。返回值类型list::size_type。

示例代码

 

#include<iostream>
#include<list>
 
using namespace std;
 
int
main(void)
{
    list<int> l(10, 20);
   
    // list::empty
    if(l.empty()){
       cout << "Listis empty" << endl;
    }else{
       cout << "Listis not empty" << endl;
    }
   
    cout << "Listsize : " << l.size() << endl;
    cout << "Listmax size : " << l.max_size() << endl;
   
    return(0);
}

Element access


list::front()

         返回list第一个元素的引用。返回值类型reference/const_reference。

list::back()

         返回list最后一个元素的引用。返回值类型reference/const_reference。

示例代码

#include<iostream>
#include<list>
 
using namespace std;
 
int
main(void)
{
    int arr[] = {1, 2, 3, 4, 5};
    list<int> l(arr, arr + sizeof(arr)/sizeof(int));
   
    // list::front
    cout << "Thefirst element is : " << l.front() << endl;
    // list::back
    cout << "Thesecond element is : " << l.back() << endl;
 
    return(0);
}

Modifiers


list::assign()

         为list分配新的内容,以代替当前内容,并随之改变其大小。

list::emplace_front()

        在list的前端插入一个元素。插入的元素由其构造函数创建。

list::push_front()

         在list的前端插入一个元素。与emplace_front()不同,它的插入方式是将一个已存在的元素复制或移动到list前端。

list::pop_front()

         删除list的第一个元素。

list::emplace_back()

         在list的末端插入一个元素。插入的元素由其构造函数创建。

list::push_back()

         在list的末端插入一个元素。与emplace_back()不同,它的插入方式是将一个已存在的元素复制或移动到list末端。

list::pop_back()

         删除list的最后一个元素。

list::emplace()

         在指定位置插入一个元素。插入的元素由其构造函数创建。

list::insert()

         在指定位置插入一个或多个元素。对于插入大量元素来说是非常高效的。

list::erase()

         从list中删除指定位置的一个或一定范围的元素。

list::swap()

         交换两个list中的元素。两个list类型必须相同,大小可以不同。

list::resize()

         重新分配list的大小,使其能容纳指定数量的元素。

list::clear

         删除list中的所有元素。

示例代码

#include<iostream>
#include<list>
#include<vector>
 
using namespace std;
 
void
print(list<int> l)
{
    for(list<int>::iterator it = l.begin(); it != l.end(); ++it)
    {
       cout << *it << "";
    }
    cout << endl;
}
 
int
main(void)
{
    list<int> first;
    list<int> second;
    list<int> third;
    int arr[] = {1, 2, 3, 4, 5};
   
    // list::assign
    first.assign(5, 10);
    second.assign(first.begin(), first.end());
    third.assign(arr, arr + sizeof(arr)/sizeof(int));
    print(first);
    print(second);
    print(third);
   
    // list::emplace emplace_front emplace_back
    list<pair<int, char>> pl;
    pl.emplace_front(1, 'a');
    pl.emplace_front(2, 'b');
    pl.emplace_back(3, 'c');
    pl.emplace(pl.end(), 4, 'd');
    for(pair<int, char> x :pl)
    {
        cout<< x.first << "" << x.second << endl;
    }
   
    //list::push_front push_back
    third.push_front(10);
    third.push_back(20);
    print(third);
   
    // list::insert
    first.insert(first.begin(), 20);
    first.insert(first.end(), 2, 30);
    vector<int> vec(2, 40);
    first.insert(first.end(), vec.begin(), vec.end());
    print(first);
   
    // list::erase
    second.erase(second.begin());
    print(second);
    second.erase(++second.begin(), second.end());
    print(second);
   
    // list::swap
    second.swap(first);
    print(first);
    print(second);
   
    // list::resize
    third.resize(5);
    print(third);
    third.resize(10);
    print(third);
    third.resize(15, 100);
    print(third);
   
    // list::clear
    third.clear();
    cout << "Thesize of third is : " << third.size() << endl;
 
    return(0);
}

Operations


list::splice()

         将一个list A中的元素转移到list B的指定位置,并将A中被转移的元素删除。

list::remove()

         将list中指定的元素删除。

list::remove_if()

         根据判断条件删除list的元素,如果条件为真则删除该元素。

list::unique()

         删除list中具有相同值的元素,只保留第一个。也可以根据条件删除具有相同条件的元素,只保留第一个。

list::merge()

         合并两个list,在合并之前两个list应该先排序,合并之后的list依然有序。也可以自定义排序的条件。

list::sort()

         对list中的元素进行排序,变更它们在容器中的位置。sort()还可以按给定条件进行排序。

list::reverse()

         改变list中元素的顺序。

示例程序

#include<iostream>
#include<cmath>
#include<list>
 
using namespace std;
 
void
print(list<int> l)
{
    for(list<int>::iterator it = l.begin(); it != l.end(); ++it)
    {
       cout << *it << "";
    }
    cout << endl;
}
 
bool
single_dight(const int &val)
{
    return val > 10;
}
 
bool
is_near(int first, int second)
{
    return(fabs(first - second) < 5);
}
 
bool
reverse(int first, int second)
{
    return((first -second) > 0);
}
 
int
main(void)
{
    list<int> first(2, 10);
    list<int> second(2, 20);
    list<int>::iteratorit;
   
    // list::splice
    it = first.begin();
    first.splice(it, second);
    print(first);
    if(second.empty())
    {
       cout << "Secondis empty" << endl;
    }
    else
    {
       cout << "Secondis not empty" << endl;
    }
    // it still point to 10(the 3th element)
    cout << *it << endl;
    second.splice(second.begin(), first, it);
    print(second);
   
    it = first.begin();
    advance(it, 2);
    print(first);
    first.splice(first.begin(), first, it, first.end());
    print(first);
   
    // list::remove
    cout << "Beforeremove : ";
    print(first);
    first.remove(10);
    cout << "Afterremove : ";
    print(first);
   
    // list::remove_if
    cout << "Beforeremove_if : ";
    first.push_back(10);
    print(first);
    first.remove_if(single_dight);
    cout << "Afterremove_if : ";
    print(first);
   
    // list::unique
    first.push_back(20);
    first.push_back(20);
    first.push_back(21);
    cout << "Beforecall unique() : ";
    print(first);
    first.unique();
    cout << "Aftercall unique() : ";
    print(first);
   
    cout << "Beforecall unique() : ";
    print(first);
    first.unique(is_near);
    cout << "Aftercall unique() : ";
    print(first);
   
    // list::merge
    first.push_back(5);
    first.push_back(12);
    first.sort();
    print(first);
    second.push_back(9);
    second.push_back(17);
    second.sort();
    print(second);
   
    first.merge(second);
    print(first);
   
    // list::sort
    first.sort(reverse);
    print(first);
   
    // list::reverse
    first.reverse();
    print(first);
    return(0);
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值