[#BloombergLP-bdlb-TopologicalSortUtil-sort-03]
= xref:BloombergLP.adoc[BloombergLP]::xref:BloombergLP/bdlb.adoc[bdlb]::xref:BloombergLP/bdlb/TopologicalSortUtil.adoc[TopologicalSortUtil]::sort
:relfileprefix: ../../../
:mrdocs:

Sort the input elements in topological order and write the resulting linear ordered set into the specified `resultOutIter`&period; If the sort is unsuccessful (the input is not an acyclic directed graph) write the elements that have not been sorted to the specified `unsortedOutIter` output&period; The input elements are provided as a sequence of (conceptual or physical) pairs between the specified `relationsBegin` and `relationsEnd` of the form (U, V), where U and V are nodes, and U precedes V in the output&period; Return `true` on success, and `false` if the sort fails due to a cycle in the input&period; The type `bsl&colon;&colon;iterator&lowbar;traits&lt;INPUT&lowbar;ITER&gt;&colon;&colon;value&lowbar;type` must either be `bsl` or `std&colon;&colon;pair` where the `first&lowbar;type` and `second&lowbar;type` are the same as `bsl&colon;&colon;iterator&lowbar;traits&lt;OUTPUT&lowbar;ITER&gt;&colon;&colon;value&lowbar;type` or `TopologicalSortUtilEdgeTraits` must be specialized for the type, i&period;e&period;, the supplied `bsl&colon;&colon;iterator&lowbar;traits&lt;INPUT&lowbar;ITER&gt;&colon;&colon;value&lowbar;type` must support the following syntax&colon; &grave; typedef typename bsl&colon;&colon;iterator&lowbar;traits&lt;INPUT&lowbar;ITER&gt;&colon;&colon;value&lowbar;type IterValue&semi; typedef typename bsl&colon;&colon;iterator&lowbar;traits&lt;RESULT&lowbar;ITER&gt;&colon;&colon;value&lowbar;type ResultValue&semi;

== Synopsis

Declared in `&lt;bdlb&lowbar;topologicalsortutil&period;h&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
template&lt;
    class INPUT&lowbar;ITER,
    class OUTPUT&lowbar;ITER,
    class UNSORTED&lowbar;OUTPUT&lowbar;ITER&gt;
static
bool
sort(
    INPUT&lowbar;ITER relationsBegin,
    INPUT&lowbar;ITER relationsEnd,
    OUTPUT&lowbar;ITER resultOutIter,
    UNSORTED&lowbar;OUTPUT&lowbar;ITER unsortedOutIter);
----

== Description

typedef typename TopologicalSortUtilEdgeTraits&lt;IterValue&gt; Traits&semi;

typedef typename Traits&colon;&colon;NodeType NodeType&semi;

for (INPUT&lowbar;ITER it &equals; relationshipPairsBegin&semi; it !&equals; relationshipPairsEnd&semi; &plus;&plus;it) &lcub;

&ast;result&plus;&plus; &equals; Traits&colon;&colon;from(&ast;it)&semi; &sol;&sol; U &ast;result&plus;&plus; &equals; Traits&colon;&colon;to(&ast;it)&semi; &sol;&sol; V &rcub; &grave; Note that when the method returns `false`, `resultOutIter` may contain a subset of the elements in the right topological order, essentially the elements that the routine was able to sort before the cycle was discovered&period; In that case, the elements that the routine was unable to sort were written to the `unsortedOutIter` output iterator, in an unspecified order&period;


[.small]#Created with https://www.mrdocs.com[MrDocs]#
