导航:首页 > 文档加密 > stl加密算法

stl加密算法

发布时间:2022-03-14 07:59:24

㈠ STL的算法

大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类型要高。而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。<functional>中则定义了一些模板类,用以声明函数对象。

㈡ stl算法中sort如果第三个参数为一个string类型的数据会是什么情况

不会排序的!通过不了!
2个参数的,要求要么普通数据类型,要么重载<运算符
3个参数的,要求第三个参数是返回bool类型的函数指针!

㈢ djstl算法

定义Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN,
CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。
问题描述在无向图
G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)

编辑本段迪杰斯特拉算法迪杰斯特拉(Dijkstra)算法思想
按路径长度递增次序产生最短路径算法:

把V分成两组:

(1)S:已求出最短路径的顶点的集合

(2)V-S=T:尚未确定最短路径的顶点集合

将T中顶点按最短路径递增的次序加入到S中,

保证:(1)从源点V0到S中各顶点的最短路径长度都不大于

从V0到T中任何顶点的最短路径长度

(2)每个顶点对应一个距离值

S中顶点:从V0到此顶点的最短路径长度

T中顶点:从V0到此顶点的只包括S中顶点作中间

顶点的最短路径长度

依据:可以证明V0到T中顶点Vk的最短路径,或是从V0到Vk的

直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和

(反证法可证)

求最短路径步骤
算法步骤如下:

1. 初使时令 S={V0},T={其余顶点},T中顶点对应的距离值

若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值

若不存在<V0,Vi>,d(V0,Vi)为∝

2. 从T中选取一个其距离值为最小的顶点W且不在S中,加入S

3. 对S中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的

距离值缩短,则修改此距离值

重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

编辑本段迪杰斯特拉算法的原理首先,引进一个辅助向量D,它的每个分量D表示当前所找到的从始点v到每个终点vi的最短路径的长度。如D[3]=2表示从始点v到终点3的路径相对最小长度为2。这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于最短路径长度。它的初始状态为:若从v到vi有弧,则D为弧上的权值;否则置D为∞。显然,长度为
D[j]=Min{D | vi∈V} 的路径就是从v出发的长度最短的一条最短路径。此路径为(v,vj)。
那么,下一条长度次短的最短路径是哪一条呢?假设该次短路径的终点是vk,则可想而知,这条路径或者是(v,vk),或者是(v,vj,vk)。它的长度或者是从v到vk的弧上的权值,或者是D[j]和从vj到vk的弧上的权值之和。
一般情况下,假设S为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达顶点X的路径。因此,下一条长度次短的最短路径的长度必是D[j]=Min{D
| vi∈V-S} 其中,D或者是弧(v,vi)上的权值,或者是D[k](vk∈S)和弧(vk,vi)上的权值之和。 迪杰斯特拉算法描述如下:
1)arcs表示弧上的权值。若不存在,则置arcs为∞(在本程序中为MAXCOST)。S为已找到从v出发的最短路径的终点的集合,初始状态为空集。那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D=arcs[Locate
Vex(G,v),i] vi∈V 2)选择vj,使得D[j]=Min{D | vi∈V-S} 3)修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。

编辑本段迪杰斯特拉算法C#程序public class Edge

{

public string StartNodeID ;

public string EndNodeID ;

public double Weight ; //权值,代价

} 节点则抽象成Node类,一个节点上挂着以此节点作为起点的“出边”表。

public class Node

{

private string iD ;

private ArrayList edgeList ;//Edge的集合--出边表

public Node(string id )

{

this.iD = id ;

this.edgeList = new ArrayList() ;

}

property#region property

public string ID

{

get

{

return this.iD ;

}

}

public ArrayList EdgeList

{

get

{

return this.edgeList ;

}

}

#endregion

}

在计算的过程中,我们需要记录到达每一个节点权值最小的路径,这个抽象可以用PassedPath类来表示:

/// <summary>

/// PassedPath 用于缓存计算过程中的到达某个节点的权值最小的路径

/// </summary>

public class PassedPath

{

private string curNodeID ;

private bool beProcessed ; //是否已被处理

private double weight ; //累积的权值

private ArrayList passedIDList ; //路径

public PassedPath(string ID)

{

this.curNodeID = ID ;

this.weight = double.MaxValue ;

this.passedIDList = new ArrayList() ;

this.beProcessed = false ;

}

#region property

public bool BeProcessed

{

get

{

return this.beProcessed ;

}

set

{

this.beProcessed = value ;

}

}

public string CurNodeID

{

get

{

return this.curNodeID ;

}

}

public double Weight

{

get

{

return this.weight ;

}

set

{

this.weight = value ;

}

}

public ArrayList PassedIDList

{

get

{

return this.passedIDList ;

}

}

#endregion

}

另外,还需要一个表PlanCourse来记录规划的中间结果,即它管理了每一个节点的PassedPath。

/// <summary>

/// PlanCourse 缓存从源节点到其它任一节点的最小权值路径=》路径表

/// </summary>

public class PlanCourse

{

private Hashtable htPassedPath ;

#region ctor

public PlanCourse(ArrayList nodeList ,string originID)

{

this.htPassedPath = new Hashtable() ;

Node originNode = null ;

foreach(Node node in nodeList)

{

if(node.ID == originID)

{

originNode = node ;

}

else

{

PassedPath pPath = new PassedPath(node.ID) ;

this.htPassedPath.Add(node.ID ,pPath) ;

}

}

if(originNode == null)

{

throw new Exception("The origin node is not exist !")
;

}

this.InitializeWeight(originNode) ;

}

private void InitializeWeight(Node originNode)

{

if((originNode.EdgeList == null)
||(originNode.EdgeList.Count == 0))

{

return ;

}

foreach(Edge edge in originNode.EdgeList)

{

PassedPath pPath = this[edge.EndNodeID] ;

if(pPath == null)

{

continue ;

}

pPath.PassedIDList.Add(originNode.ID) ;

pPath.Weight = edge.Weight ;

}

}

#endregion

public PassedPath this[string nodeID]

{

get

{

return (PassedPath)this.htPassedPath[nodeID] ;

}

}

}

在所有的基础构建好后,路径规划算法就很容易实施了,该算法主要步骤如下:

(1)用一张表(PlanCourse)记录源点到任何其它一节点的最小权值,初始化这张表时,如果源点能直通某节点,则权值设为对应的边的权,否则设为double.MaxValue。

(2)选取没有被处理并且当前累积权值最小的节点TargetNode,用其边的可达性来更新到达其它节点的路径和权值(如果其它节点
经此节点后权值变小则更新,否则不更新),然后标记TargetNode为已处理。

(3)重复(2),直至所有的可达节点都被处理一遍。

(4)从PlanCourse表中获取目的点的PassedPath,即为结果。

下面就来看上述步骤的实现,该实现被封装在RoutePlanner类中:

/// <summary>

/// RoutePlanner 提供图算法中常用的路径规划功能。

/// 2005.09.06

/// </summary>

public class RoutePlanner

{

public RoutePlanner()

{

}

#region Paln

//获取权值最小的路径

public RoutePlanResult Paln(ArrayList nodeList ,string
originID ,string destID)

{

PlanCourse planCourse = new PlanCourse(nodeList
,originID) ;

Node curNode = this.GetMinWeightRudeNode(planCourse
,nodeList ,originID) ;

#region 计算过程

while(curNode != null)

{

PassedPath curPath = planCourse[curNode.ID] ;

foreach(Edge edge in curNode.EdgeList)

{

PassedPath targetPath = planCourse[edge.EndNodeID] ;

double tempWeight = curPath.Weight + edge.Weight ;

if(tempWeight < targetPath.Weight)

{

targetPath.Weight = tempWeight ;

targetPath.PassedIDList.Clear() ;

for(int i=0 ;i<curPath.PassedIDList.Count ;i++)

{

targetPath.PassedIDList.Add(curPath.PassedIDList.ToString())
;

}

targetPath.PassedIDList.Add(curNode.ID) ;

}

}

//标志为已处理

planCourse[curNode.ID].BeProcessed = true ;

//获取下一个未处理节点

curNode = this.GetMinWeightRudeNode(planCourse
,nodeList ,originID) ;

}

#endregion

//表示规划结束

return this.GetResult(planCourse ,destID) ;

}

#endregion

#region private method

#region GetResult

//从PlanCourse表中取出目标节点的PassedPath,这个PassedPath即是规划结果

private RoutePlanResult GetResult(PlanCourse
planCourse ,string destID)

{

PassedPath pPath = planCourse[destID] ;

if(pPath.Weight == int.MaxValue)

{

RoutePlanResult result1 = new RoutePlanResult(null
,int.MaxValue) ;

return result1 ;

}

string[] passedNodeIDs = new
string[pPath.PassedIDList.Count] ;

for(int i=0 ;i<passedNodeIDs.Length ;i++)

{

passedNodeIDs = pPath.PassedIDList.ToString() ;

}

RoutePlanResult result = new
RoutePlanResult(passedNodeIDs ,pPath.Weight) ;

return result ;

}

#endregion

#region GetMinWeightRudeNode

//从PlanCourse取出一个当前累积权值最小,并且没有被处理过的节点

private Node GetMinWeightRudeNode(PlanCourse
planCourse ,ArrayList nodeList ,string originID)

{

double weight = double.MaxValue ;

Node destNode = null ;

foreach(Node node in nodeList)

{

if(node.ID == originID)

{

continue ;

}

PassedPath pPath = planCourse[node.ID] ;

if(pPath.BeProcessed)

{

continue ;

}

if(pPath.Weight < weight)

{

weight = pPath.Weight ;

destNode = node ;

}

}

return destNode ;

}

#endregion

#endregion

}

编辑本段迪杰斯特拉算法pascal程序type bool=array[1..10]of
boolean;

arr=array[0..10]of integer;

var a:array[1..10,1..10]of integer;
//存储图的邻接数组,无边为10000

c,d,e:arr; //c为最短路径数值,d为各点前趋,

t:bool; //e:路径,t为辅助数组

i,j,n,m:integer;

inf,outf:text;

////////////////////////////////////////////////////////////////////////////////

procere init; //不同题目邻接数组建立方式不一样

begin

assign(inf,'dijkstra.in');
assign(outf,'dijkstra.out');

reset(inf); rewrite(outf);

read(inf,n);

for i:=1 to n do

for j:=1 to n do

begin

read(inf,a[i,j]);

if a[i,j]=0 then a[i,j]:=10000;

end;

end;

////////////////////////////////////////////////////////////////////////////////

procere dijkstra(qi:integer; t:bool; var c{,d}:arr);
//qi起点,{}中为求路径部

var i,j,k,min:integer; //分,不需求路径时可以不要

begin //t数组一般在调用前初始

t[qi]:=true; //化成false,也可将部分点

{for i:=1 to n do d[i]:=qi; d[qi]:=0; }
//初始化成true以回避这些点

for i:=1 to n do c[i]:=a[qi,i];

for i:=1 to n-1 do

begin

min:=10001;

for j:=1 to n do

if (c[j]<min)and(not(t[j])) then begin k:=j;
min:=c[j];end;

t[k]:=true;

for j:=1 to n do

if (c[k]+a[k,j]<c[j])and(not(t[j])) then

begin

c[j]:=c[k]+a[k,j]; {d[j]:=k;}

end;

end;

end;

////////////////////////////////////////////////////////////////////////////////

procere make(zh:integer; d:arr; var e:arr);
//生成路径,e[0]保存路径

var i,j,k:integer; //上的节点个数

begin

i:=0;

while d[zh]<>0 do

begin

inc(i);e[i]:=zh;zh:=d[zh];

end;

inc(i);e[i]:=qi; e[0]:=I;

end;

主程序调用:求最短路径长度:初始化t,然后dijkstra(qi,t,c,d)

求路径:make(m,d,e) ,m是终点

编辑本段Dijkstra算法的堆优化(PASCAL实现)一、思考
我们可以发现,在实现步骤时,效率较低(需要O(n),使总复杂度达到O(n^2)。对此可以考虑用堆这种数据结构进行优化,使此步骤复杂度降为O(log(n))(总复杂度降为O(n
log(n))。

二、实现
1. 将与源点相连的点加入堆,并调整堆。
2. 选出堆顶元素u(即代价最小的元素),从堆中删除,并对堆进行调整。
3. 处理与u相邻的,未被访问过的,满足三角不等式的顶点
1):若该点在堆里,更新距离,并调整该元素在堆中的位置。
2):若该点不在堆里,加入堆,更新堆。
4. 若取到的u为终点,结束算法;否则重复步骤2、3。
三、代码
procere Dijkstra;

var

u,v,e,i:longint;

begin

fillchar(dis,sizeof(dis),$7e); //距离

fillchar(Inh,sizeof(Inh),false); //是否在堆中

fillchar(visit,sizeof(visit),false); //是否访问过

size:=0;

e:=last[s];

while e<>0 do //步骤1

begin

u:=other[e];

if not(Inh[u]) then //不在堆里

begin

inc(size);

heap[size]:=u;

dis[u]:=cost[e];

Loc[u]:=size; //Loc数组记录元素在堆中的位置

Inh[u]:=true;

Shift_up(Loc[u]); //上浮

end

else

if cost[e]<dis[u] then //在堆里

begin

dis[u]:=cost[e];

Shift_up(Loc[u]);

Shift_down(Loc[u]);

end;

e:=pre[e];

end;

visit[s]:=true;

while true do

begin

u:=heap[1]; //步骤2

if u=t then break; //步骤4

visit[u]:=true;

heap[1]:=heap[size];

dec(size);

Shift_down(1);

e:=last[u];

while e<>0 do //步骤3

begin

v:=other[e];

if Not(visit[v]) and (dis[u]+cost[e]<dis[v]) then
//与u相邻的,未被访问过的,满足三角不等式的顶点

if Inh[v] then //在堆中

begin

dis[v]:=dis[u]+cost[e];

Shift_up(Loc[v]);

Shift_Down(Loc[v]);

end

else //不再堆中

begin

inc(size);

heap[size]:=v;

dis[v]:=dis[u]+cost[e];

Loc[v]:=size;

Inh[v]:=true;

Shift_up(Loc[v]);

end;

e:=pre[e];

end;

end;

writeln(dis[t]);

end;
http://ke..com/view/7839.htm

http://ke..com/view/1939816.htm

㈣ 简述stl格式的优缺点

STL优点:

代码易读性强;

STL集成了优秀的算法,熟悉使用可以提高开发效率;
精通STL后,可以自己用模板去设计实现自己的算法和数据结构。

STL缺点:

STL和其他的类库的接口不太方便。
例如在VCL和MFC中,都有自己的string类型,CString和AnsiString,其余接口如果使用字符串,肯定是使用自己的原生类型,然而为了设计可移植的程序,有可能将平台独立的部分用STL实现,这样导致了在两部分合作时存在大量的转型动作,而且必须付出额外的转型动作,例如std::string和CString/AnsiString没有直接的转型方法,因此必须通过char *作为转型的媒介。

㈤ STL 算法问题

IsAToothbrush 是函数对象(function object),如果可以,关于这个概念还是建议你翻一下手头的书,你就明白了。函数对象的定义就是一个类重载了()运算符,而函数count_if 需要一个函数对象(我对stl也不完全了解,不知道这里传一个函数指针是不是也是可以的,但是例子里面用的是函数对象),这个对象的作用就是 count_if函数执行的时候,会遍历集合的元素,用调用operator()来判断是否要删除某个元素

㈥ STL中的算法是对所有容器都适用吗

c++ stl 标准模板库 c++容器类vector . 向量容器deque 双端队列容器list 双向链表容器slist 单向链表容器bit_vector 位向量容器set 集合容器multiset 多重集合容器map 映照容器multimap 多重映照容器hash_set 哈希集合容器hash_map 哈希映照容器string 基本字符序列容器stack 堆栈容器queue 队列容器priority_queue 优先队列容器 c++stl 算法 逐个容器元素 for_each查找容器元素 find 条件查找 find_if邻近查找容器 adjacent_find范围查找容器元素 find_first_of统计等于某值的容器元素个数 count条件统计 count_if..这里还有很多很多 算法 其中比较有用的sort 排序stable_sort 稳定排序反向元素 reverse旋转 rotate

㈦ 表明feistel解密是加密的逆feistl

主要还是Feistel网络的求逆,可以去看看Feistel结构。不懂再一起讨论讨论~

㈧ STL是什么意思

什么是STL呢?STL就是Standard
Template
Library,标准模板库。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。
STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什麽。它被内建在你的编译器之内。因为STL的list是一个简单的容器,所以我打算从它开始介绍STL如何使用。如果你懂得了这个概念,其他的就都没有问题了。另外,list容器是相当简单的,我们会看到这一点。
在本文中我们将会看到如何定义和初始化一个list,计算它的元素的数量,从一个list里查找元素,删除元素,和一些其他的操作。要作到这些,我们将会讨论两个不同的算法,STL通用算法都是可以操作不止一个容器的,而list的成员函数是list容器专有的操作。
这是三类主要的STL组件的简明纲要。STL容器可以保存对象,内建对象和类对象。它们会安全的保存对象,并定义我们能够操作的这个对象的接口。放在蛋架上的鸡蛋不会滚到桌上。它们很安全。因此,在STL容器中的对象也很安全。我知道这个比喻听起来很老土,但是它很正确。
STL算法是标准算法,我们可以把它们应用在那些容器中的对象上。这些算法都有很着名的执行特性。它们可以给对象排序,删除它们,给它们记数,比较,找出特殊的对象,把它们合并到另一个容器中,以及执行其他有用的操作。
http://www.yesky.com/255/1910755.shtml
还有一种解释:
什么是STL?
STL代表科学和技术素养,但这个短语的背后隐藏的重要意义是对所有人而言。
STL也许可以简单地视为一个哲学观点,但决不仅仅如此。它包括了一套完整的教育方法,这个方法包含生活中的科学技术和不仅是学校师生的还有普通市民和政治家在内的所有人的思想。
为了达到普及科学技术的要求,科学技术的排它性和教师\科学家对科学教育的态度要根本转变。
课堂中的科学教育要从教师为主导、以教学大纲为核心的教育方式中解脱出来,代之以学生为中心来设计、指导和进行组织教学。为了使学生全身心投入学习动机是非常重要的而且这将只有在科学技术成为学生日常生活的需要时才能得到激发。
考虑到这些,我们现在是现代世界的一部分,这种意识比以前更为强烈,知识的获取与事实的记忆日益无关。一个微型移动电话能够直接接入因特网。这是能够在我们的指尖表达出一些事实信息。结果是学生在大量的事实学习(这是很快过时的知识)的思维负担是明显无意义的。
一旦这些负担被减轻了,全体学生亲自感受科学和技术的潜能就能被发掘出来。科学和技术不再被看作仅仅是’最聪明的’学生的宝贝。批判性思维得到解放。这些能揭示挑战不可靠信息和无确实根据的个人观点的思维方法,不管这些观点是来自’专家’,还是广告代理商或者政治家们。
现存的许多科学技术的排它性营造了道德和价值观来自于艺术和人文的氛围。实际上许多当前

㈨ STL是什么

STL是司太立合金的简称

司太立(Stellite)是一种能耐各种类型磨损和腐蚀以及高温氧化的硬质合金。即通常所说的钴基合金,司太立合金由美国人Elwood Hayness 于1907年发明。司太立合金是以钴作为主要成分,含有相当数量的镍、铬、钨和少量的钼、铌、钽、钛、镧等合金元素,偶而也还含有铁的一类合金。根据合金中成分不同,它们可以制成焊丝,粉末用于硬面堆焊,热喷涂、喷焊等工艺,也可以制成铸锻件和粉末冶金件。

司太立合金铸件适用于核电、石化、电力、电池、玻璃、轻工、食品等诸多领域。具有耐磨、耐蚀、抗氧化和耐高温特性。常用的产品有阀芯、阀座、轴类、轴套、泵类部件,玻璃、电池模具、喷嘴及切割刀具等。合金类别有:Co基合金铸件、Ni基合金铸件、Fe基合金铸件。司太立粉末冶金制品采用钴基、镍基或铁基合金雾化粉末,经压制、烧结、精加工制成。主要产品有阀杆、阀芯(球)、阀座、阀圈、密封环、木材锯齿、轴承泵、轴承球等。

阅读全文

与stl加密算法相关的资料

热点内容
数字编程学院 浏览:94
程序员不时尚 浏览:745
不付费看网站 浏览:230
《代人受过》训诫文 浏览:258
1n.d5h49m6. 浏览:687
linuxweb目录权限 浏览:945
WWW 5a5e 浏览:544
id3v2java 浏览:222
怎么打开mysql命令行 浏览:522
linux文件星号 浏览:632
小城与小妈去北京旅游叫什么小说 浏览:230
pdf阅读器推荐 浏览:81
能免费看英语电影的软件 浏览:126
有部电影女主半夜出去卖淫 浏览:628
西门子编程试题 浏览:82
android转动360 浏览:334
服务器为什么要重装系统 浏览:438
华为尝鲜怎么还是原来的安卓系统 浏览:595
女主是警察的小说 浏览:792
魔兽宏命令是什么 浏览:250