C++标准模板库学习笔记之序列容器(deque、list)

deque是双端队列,可以在头部或者尾部高效的进行添加和删除对象。书上给出的应用场景是数据库事务和超市结账等情形。今天刚好看了数据库的事务处理,后面有空再写。

deque<int> deq;//空的双端队列

deque<int> deq(10);//包含十个元素为0的双端队列

deque<int> deq{1,2,3,4,5};//带初始化元素的双端队列

deque有拷贝构造函数,可以在初始化的时候使用一个已存在的双端队列进行初始化。

deque<int> deq1{deq};//这里也可以用迭代器来进行初始化,除了deque,其他容器也适用。

deque和vector的不同之处:

1,由于deque可以在两端进行操作,因此deque的size和capicity始终相等。因此,deque没有定义成员函数capacity,只定义了size。

2,deque没有vector那么高效,操作起来比vector要慢。

添加和删除:push_front(),push_back(),pop_front();


list容器,即链表容器,是个双向链表。

链表的插入:push_front()、push_back()、emplace_front()、emplace_back()、insert(迭代器,数值)

迭代器的全局函数advance(迭代器,步数),可以让迭代器往前走用户定义的步数

删除元素:remove、clear、erase。

remove(元素值):删除链表中等于指定元素值的节点。

remove_if([](int value){return value%2==0;});    //remove_if的参数是个一元断言,该断言返回一个bool值,满足要求的将会被移除出链表。

unique函数:可以移除连续重复的元素,只留下其中一个(可以用来去重嘛:先排个序,在用这个函数即可)

排序:由于algorithm要求使用随机访问迭代器,list没法使用algorithm的sort函数,只好用自己的咯。

sort()//无参形式会默认升序。

sort(有参)//有参形式比较灵活,可以使用lambda表达式来进行排序,例如:

mylist.sort(greater<int>());//按照降序排列

我自己写了一个测试用例:

struct SNode
{
SNode(int p_id, string p_name)
{
id = p_id;
name = p_name;
}
friend ostream &operator<<(ostream &out, SNode node);    //结构体的<<重载,友元函数

int id;
string name;
};
ostream &operator<<(ostream &out, SNode node)    
{
cout << node.id << " " << node.name << endl;
return out;
}

list<SNode> myNodeList{ SNode(1, "zhou"), SNode(3, "zhao"),SNode(2, "jiang") };//链表中的节点为SNode类型
myNodeList.sort([](SNode node1, SNode node2) {return node1.id > node2.id;});//写了一个lambda断言表达式,按照id从大到小排序。

transform(begin(myNodeList), end(myNodeList), ostream_iterator<SNode>(cout, ""), [](SNode value) {return value;});//使用transform打印结果

输出:

3 zhao 

2 jiang 

1 zhou

平时写的代码都是python下的lambda表达式,原来在C++也可以玩的飞起,哈哈!^0^

merge函数,看上去像合并排序哦!还真是!

list<int> l1{1,3,5,7};

list<int> l2{2,4,6,8};

l1.merge(l2);//执行该语句以后,list1变为1,2,3,4,5,6,7,8。list2变成空链表了!

splice函数:用于移动list2的元素到list1的某个位置处。splice(目的容器迭代器,元素来源,指向源容器的迭代器);

例子:

list<int> l1{1,3,5,7};

list<int> l2{2,4,6,8};

l1.splice(begin(l1), l2,++begin(l2), end(l2));    //将l2从第二个元素开始放进l1的第一个元素的前面。

处理之后l1变为4,6,8,1,3,5,7,l2变为2


猜你喜欢

转载自blog.csdn.net/u012260341/article/details/79844027