链表类型list和foreard_list的特定容器算法

时间:2014.06.07

地点:基地

---------------------------------------------------------------------------

一、简述

由于list和forward_list分别提供了双向迭代器和前向迭代器,因此,凡要求随机访问迭代器的通用泛型算法是不能作用于链表的。另外,也正由于链表自身的性质,通用的算法作用于链表时或许又代价太高,因为它们往往使用交换输入序列中的元素,而链表无需交换元素,只需简单的改变元素间的链接即可,于是链表版本的算法性能比通用版本的要好。

---------------------------------------------------------------------------

二、详情

对于list和forward_list,优先使用成员函数版本的算法,而不是使用通用算法。

这些成员函数版本的算法又如下:

lst.merge(lst2);                //使用 < 运算符将list2的元素合并入lst,lst和lst2都必须是有序,而且元素将从lst2中删除,在合并之后,lst2会变为空。即相当于元素移动操作,注意这里是合并,不是拼接,后面会说道链表拼接的概念

lst.merge(lst2,comp);      //使用给定比较操作,将lst2中的元素移动到lst中

lst.remove(val);                //调用erase删除与给定值相等的所有元素

lst.remove_if(pred);          //调用erase删除使得一元谓词为真的所有元素

lst.reverse()                     //反转lst中元素的顺序

lst.sort();                           //使用 < 运算符或给定操作排序

lst.sort(comp)

lst.unique()                   //调用erase删除同一值连续冗余副本,这里使用 == 操作符

lst.unique(pred);          //调用erase删除使得二元谓词为真的连续冗余副本

以上5大特定容器算法对于list和forward_list均适用。

再来看一个splice算法,splice即接合和拼接的意思,与merge不一样的是splice是将两个链表简单地拼接在一起,而不实现元素融合merge:

lst.splice(p,lst2);                       //p是lst中元素的迭代器,或者是flst首前位置的迭代器,将lst2的所有元素移动到lst中p之前的位置,

flst.splice_after(p,lst2);            //或者是flst中p之后的位置。且lst2的类型必须与lst或flst相同,且不能是链表自己

lst.splice(p,lst2,p2);                  //p2是lst2中元素的迭代器,将p2指向的元素移动到lst中,或将p2之后的元素移动到flst中,lst2在这里可以

flst.splice_after(p,lst2,p2)         //是与lst或flst相同的链表

lst.splice(p,lst2,b,e);                 //b 和 e是一对迭代器,能表示lst2的合法范围,将给定范围内的元素移动到lst或flst中,lst2可以与lst或

flst.splice_afte(p,lst2,b,e)         //flst是相同的链表,只是p不能指向给定范围中的元素

---------------------------------------------------------------------------

三、链表特定容器算法特定表现

与通用的容器算法不一样,链表特定的容器算法它会改变容器,比如remove操作它会很实在地移动指定元素,元素被移动后,在本链表中就不再存在,又比如unique操作会很实在的删除冗余的元素。merge和splice也是一样,我们知道通用版的merge是将两个序列合并后写入第三个目的迭代器,输入序列并不改变,而链表版的merge函数会从一个链表中将元素移动到指定链表中,注意是移动,不是copy。

---------------------------------------------------------------------------

四、练习题

删除重复单词

#include<iostream>
#include<list>
#include<string>
using namespace std;
void ElimDups(list<string>& words_list)
{
	words_list.sort();
	words_list.unique();
}
int main()
{
	list<string> words_list;
	string word;
	cout << "Input words: " << endl;
	while (cin>>word)
	{
		words_list.push_front(word);
	}
	ElimDups(words_list);
	for (auto word : words_list)
		cout << word << " ";
	cout << endl;
}

链表类型list和foreard_list的特定容器算法

时间: 2024-11-05 14:54:35

链表类型list和foreard_list的特定容器算法的相关文章

【足迹C++primer】35、特定容器算法

特定容器算法 lst.merge(lst2) 将来自lst2的元素并入到lst.这两个都必须是有序的. lst.merge(lst2, comp) 元素将从lst2删除,第一个版本使用<运算符,第二个版本使用给定的运算符 lst.remove(lst2)调用erase删除掉与给定值相等(==)或令一元谓词为真的每个元素 lst.remove_if(pred) lst.reverse() 反转lst中元素的顺序 lst.sort() 使用<或给定比较操作排序元素 lst.sort(comp) l

Redis学习笔记10Redis数据类型之(3) 链表类型

1.1.1. lpush 在链表的头部插入一个或多个值. 语法: LPUSH key value [value ...] 参数: key 键名.键值为一个链表. value  要插入的值. 返回值: 整数:在插入之后,链表的长度. ERROR:key对应的对象不是链表类型. 例子: redis.coe2coe.me:6379> lpush mylist host redis.coe2coe.me (integer) 2 redis.coe2coe.me:6379> lpush mylist p

C++ vector类型要点总结(以及各种algorithm算法函数)

概述 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现. 容器向量也是一个类模板.vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,但是一个容器中的对象必须是同一种类型.简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector是一个类模板,

链表类型的栈结构

import org.w3c.dom.Node; import java.util.LinkedList;import java.util.Scanner; /** * @author laoduan * @create 2020-04-10-17:53 */public class LinkedListStackDemo { public static void main(String[] args) { LinkedListStack linkedListStack = new Linked

链表操作法则之逆向遍历与倒置算法

一.创建链表: 对链表进行操作的所有算法的前提,就是我们首先要创建一个链表,我们可以选择正向建链和逆向建链: (一).正向建链: 首先,我们得自定义节点类型: typedef struct Node { int data;//数据域 struct Node * pNext;//指针域 }NODE,*PNODE; 通过数组进行链表数据域的赋值: int main (void) { PNODE pHead;//头指针,接收创建链表时返回的头结点地址 int a[8] = {12,37,49,65,2

1_数据结构-容器-算法

容器 可以实现 数据结构 与 算法 的分离. eg: 1.容器装基础变量类型 vector<int>lunais; lunais.push_back(1); lunais.push_back(2); lunais.push_back(3); 可使用迭代器进行遍历: for(vector<int>::interator it = lunais.begin(); it != luanis.end(); ++it) { cout << *it << endl; }

STL的容器算法迭代器的设计理念

1) STL的容器通过类模板技术,实现数据类型和容器模型的分离. 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了统一性. 3) STL的函数对象实现了自定义数据类型的算法运算 核心思想:其实函数对象本质就是回调函数,回调函数的思想,就是任务的编写者和任务的调用者有效解耦合,函数指针做函数参数. 4) 具体例子:transform算法的输入,通过迭代器first和last指向的元算作为输入:通过result作为输出:通过函数对象来做自定义数据类型的运算. 版权声明:本文为

c++容器 算法 迭代

#include <iostream> #include <vector> using namespace std; int main() { // 创建一个向量存储 int vector<int> vec; int i; // 显示 vec 的原始大小 cout << "vector size = " << vec.size() << endl; // 推入 5 个值到向量中 for(i = 0; i <

c++泛型算法(1)

顺序容器只定义了很少的操作,为了能做其他更多有用的操作:查找特定元素,替换或删除某一特定值,重排元素顺序等.泛型算法是一些经典算法的公共接口 1.概述 大多数算法都定义在头文件algorithm中,标准库还在头文件numeric中定义了一组数值泛型算法. 泛型算法不会执行容器的操作,只会运行于迭代器之上,执行迭代器的操作 .这样就导致算法不能改变容器的大小,也就不能直接添加或删除元素了.因此标准库定义了一种叫插入器的特殊迭代器来完成向容器添加元素的效果. 2.初识泛型算法 标准库提供了超过100