рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЬреВрд▓рд┐рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ
рдПрдХ рднрдпрд╛рдирдХ рд░рд╣рд╕реНрдп - рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдФрд░ "рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд" рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреА рд╕реАрдорд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИред рдХрд┐рд╕реА рднреА рдЬреВрд▓рд┐рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд┐рд▓реНрдЯ-рдЗрди рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдпрд╛ рддреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╛ рдЗрд╕ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ (рд╣реЗрд▓реЛ, рдкрд╛рдпрдерди) рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдпрд╛ рддреЛ рдЖрджрд┐рдо рдпрд╛ рд╕рдордЧреНрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рднреА рд╕рд╛рд░ рдФрд░ рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдорд┐рд╢реНрд░рд┐рдд рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБрдПрдБ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рд╕рд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗрд╡рд▓ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрдВрдкреЛрдЬрд┐рдЯ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреАрд╡рд░реНрдб struct
рдФрд░ mutable struct
рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдЯрд╛рдЗрдк Point
рдХреА рд╡рд╕реНрддреБрдПрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдПрдХ рдмрд╛рд░ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдорд╛рди рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
julia> p = Point(2, 3) Point(2, 3) julia> px 2 julia> py 3 julia> px = 4 ERROR: setfield! immutable struct of type Point cannot be changed
рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
mutable struct MutablePoint x y end julia> mp = MutablePoint(3, 4) MutablePoint(3, 4) julia> mp.y = 2 2 julia> mp MutablePoint(3, 2)
рджрдХреНрд╖рддрд╛ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
struct ParametricPoint{T<:Real} x::T y::T end
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк ParametricPoint
T
рджреНрд╡рд╛рд░рд╛ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╣реИ рдФрд░ рдлрд╝реАрд▓реНрдб x
рдФрд░ y
рдХреЛ рдЕрдм рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП T
рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
julia> ParametricPoint(1, 1) ParametricPoint{Int64}(1, 1) julia> ParametricPoint{Float64}(1, 1) ParametricPoint{Float64}(1.0, 1.0) julia> ParametricPoint{Rational}(1, 1) ParametricPoint{Rational}(1//1, 1//1)
рдЗрд╕рдХреЗ рдмрд╛рдж, рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреНрдпрд╛ рддрд░реАрдХреЗ рд╣реИрдВред
рджреЛ рддрд░рдлрд╛ рдХрддрд╛рд░
рд╣рдо DequeNode
рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдбреНрд╕ рд╕реЗ рджреЛ рддрд░рдлрд╝рд╛ рдХрддрд╛рд░ DequeNode
, рдЬрд┐рд╕рдореЗрдВ рдХрддрд╛рд░ рдХреЗ рдкрд┐рдЫрд▓реЗ рдФрд░ рдЕрдЧрд▓реЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдбреЗрдЯрд╛ рд░рд┐рдХреЙрд░реНрдб рдФрд░ рд▓рд┐рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред DequeNode
рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдВрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
mutable struct DequeNode{T} data::T prev::DequeNode{T} next::DequeNode{T}
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдВрддрд░рд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЪреВрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡-рд╕рдВрджрд░реНрднрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд╛рдирдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд╣рд▓реА рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдХрддрд╛рд░ рдиреЛрдб рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдпрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХрддрд╛рд░ рдХреЛ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ "рдЗрдирдкреБрдЯ" рдиреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреА next
рдХрдбрд╝реА рдХрддрд╛рд░ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧреА, рдФрд░ prev
рддрдХ рд░рд╣реЗрдЧреАред рдЦрд╛рд▓реА рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП, рджреЛрдиреЛрдВ рд▓рд┐рдВрдХ рдЗрдирдкреБрдЯ рдиреЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд╕рдВрдЧрдарди рдиреЛрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
struct Deque{T} entry::DequeNode{T} end Deque{T}() where T = Deque{T}(DequeNode{T}()) Deque() = Deque{Any}()
рдПрдХ рдЖрдВрддрд░рд┐рдХ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдЕрдм рдХрддрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдирд╛
рдПрдХ рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝ рд░рд╣реА рд╣реИрдВ, рдФрд░ рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓ рд░рд╣реА рд╣реИрдВред рдЗрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
push!(collection, element)
- push!(collection, element)
рд▓рд┐рдП рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВ (рдПрдХ рдЖрджреЗрд╢рд┐рдд рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП - рдЕрдВрдд рдореЗрдВ)pushfirst!(collection, element)
- рдПрдХ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВpop!(collection)
- pop!(collection)
рд╕реЗ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рд╣рдЯрд╛рдПрдВ (рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП - рдЕрдВрдд рд╕реЗ)popfirst!(collection)
- рдкрд╣рд▓реЗ рдЖрдЗрдЯрдо рдХреЛ рдПрдХ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ
рдпреЗ рд╕рднреА рдХрд╛рд░реНрдп Base
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ рдирдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдо рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдЦрд╛рд▓реА рд╣реИ - Base.isempty(collection)
ред
Base.isempty(deq::Deque) = deq.entry.prev тЙб deq.entry function Base.push!(deq::Deque{T}, elt) where T tail = deq.entry.prev new_item = DequeNode{T}(elt) new_item.prev, new_item.next = tail, deq.entry tail.next = deq.entry.prev = new_item return deq end function Base.pushfirst!(deq::Deque{T}, elt) where T head = deq.entry.next new_item = DequeNode{T}(elt) new_item.prev, new_item.next = deq.entry, head head.prev = deq.entry.next = new_item return deq end function Base.pop!(deq::Deque) !isempty(deq) || throw(ArgumentError("deque must be non-empty")) last = deq.entry.prev last.prev.next = deq.entry deq.entry.prev = last.prev return last.data end function Base.popfirst!(deq::Deque) !isempty(deq) || throw(ArgumentError("deque must be non-empty")) first = deq.entry.next first.next.prev = deq.entry deq.entry.next = first.next return first.data end
рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдХрддрд╛рд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП push!()
рдлрд╝рдВрдХреНрд╢рди рдЗрд╕реЗ рд▓рдЧрднрдЧ рддреБрдЪреНрдЫ рдмрдирд╛рддрд╛ рд╣реИ:
function Deque(itr) d = Deque{eltype(itr)}() for elt in itr push!(d, elt) end return d end
рдЕрдм рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓рдЧрднрдЧ рдПрдХ рдХрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдЪрд╛рд▓рди рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ peek()
рдФрд░ рдХрддрд╛рд░ рдХреЗ рд╕рд┐рд░ рдпрд╛ рдкреВрдВрдЫ рдореЗрдВ рддрддреНрд╡ рдХреЛ рджреЗрдЦреЗрдВ (рдЗрд╕реЗ рд╣рдЯрд╛рдП рдмрд┐рдирд╛)ред рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП, рдХрдВрдЯреЗрдирд░ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдпрд╛рддреНрд░рд╛
рдЬреВрд▓рд┐рдпрд╛ рдХрдВрдЯреЗрдирд░ рддрддреНрд╡реЛрдВ рдХреЛ рдЯреНрд░реИрд╡рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди - iterate(container, state)
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ state
iterate(container, state)
рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, for x in collection
рдирд┐рд░реНрдорд╛рдг for x in collection
рд▓рд┐рдП рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪреАрдиреА рд╣реИ:
let nextstate = iterate(collection) while nextstate тЙв nothing (x, state) = nextstate <- > nextstate = iterate(collection, state) end end
iterate()
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдХрдВрдЯреЗрдирд░ рдФрд░ рдПрдХ " iterate()
рд╕реНрдерд┐рддрд┐" рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдХрдВрдЯреЗрдирд░ рддрддреНрд╡ рдФрд░ рдЕрдЧрд▓реЗ iterate()
рд░рд╛рдЬреНрдп рд╕реЗ рдпрд╛ рддреЛ рдПрдХ рдЯрдкрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╛ nothing
рдЕрдЧрд░ рдХрдВрдЯреЗрдирд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдПрдХ рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП, рдХрддрд╛рд░ рдиреЛрдб рдХреЛ рд▓реЗрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдЬреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ "рд░рд╛рдЬреНрдп" рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ:
function Base.iterate(deq::Deque{T}, state::DequeNode{T}=deq.entry) where T nextstate = state.next nextstate тЙб deq.entry ? nothing : (nextstate.data, nextstate) end
рдЕрдм рдХрддрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд▓реВрдк рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
julia> for x in Deque(1:10) println(x); end 1 2 3 4 5 6 7 8 9 10
рдПрдХ рдмрдбрд╝рд╛ рдкреНрд▓рд╕ рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдЬреВрд▓рд┐рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рддрддреНрд╡ рдХрдВрдЯреЗрдирд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ:
julia> 5 тИИ Deque(3:10) true julia> 100 тИИ Deque(-5:5) false
рд╣рдо рдпрд╣ рднреА рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ first()
рд╡рд┐рдзрд┐, рдЬреЛ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд▓реМрдЯрд╛рддреА рд╣реИ, рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧреАред рддрд╕реНрд╡реАрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд┐рдЫрд▓реЗ рддрддреНрд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП last()
рд╡рд┐рдзрд┐ рдХреЛ рдкреВрд░рдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рддреЗ рд╣реИрдВ:
function Base.iterate(r::Base.Iterators.Reverse{Deque{T}}, state::DequeNode{T}=r.itr.entry) where T nextstate = state.prev nextstate тЙб r.itr.entry ? nothing : (nextstate.data, nextstate) end function Base.last(deq::Deque) isempty(deq) && throw(ArgumentError("deque must be non-empty")) deq.entry.prev.data end julia> for x in Iterators.reverse(Deque(1:10)) println(x); end 10 9 8 7 6 5 4 3 2 1
рддреЛ, рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрддрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ
рдкреНрд░рд┐рдВрдЯрдЖрдЙрдЯ рд╕рдВрд░рдЪрдирд╛
рдпрджреНрдпрдкрд┐ рдХрддрд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИ, рдкреНрд░рд┐рдВрдЯ рдкрд░ рдпрд╣ рдЕрднреА рднреА рдПрдХ рдирд┐рд░рд╛рдХрд╛рд░ рдЧрдВрджрдЧреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ:
julia> Deque() Deque{Any}(DequeNode{Any}(
рдЕрдзрд┐рдХ рдорд╛рдирд╡реАрдп рд░реВрдк рдореЗрдВ рдХрддрд╛рд░ рдХреЛ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдЯрд░реНрдорд┐рдирд▓ рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ Base.show()
рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЕрдзрд┐рднрд╛рд░ рджреЗрдВрдЧреЗ:
function Base.show(io::IO, deq::Deque{T}) where T print(io, "Deque{", T, "}(") next = iterate(deq) if next тЙв nothing item, state = next show(io, item) next = iterate(deq, state) while next тЙв nothing item, state = next print(io, ", ") show(io, item) next = iterate(deq, state) end end print(io, ")") end
рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдБрдЪ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдХрддрд╛рд░ рдХреЛ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдмрджрд▓рдирд╛ getindex()
рдФрд░ setindex!()
рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
function Base.getindex(deq::Deque, i::Integer) i > 0 || throw(BoundsError(deq, i)) next = iterate(deq) for idx in 1:i-1 next тЙб nothing && throw(BoundsError(deq, i)) _, state = next next = iterate(deq, state) end if next тЙб nothing throw(BoundsError(deq, i)) else return next[1] end end function Base.setindex!(deq::Deque, val, i::Integer) i > 0 || throw(BoundsError(deq, i)) next = iterate(deq) for idx in 1:i-1 next тЙб nothing && throw(BoundsError(deq, i)) _, state = next next = iterate(deq, state) end if next тЙб nothing throw(BoundsError(deq, i)) else record = next[2] record.data = val return val end end
рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рдордирдорд╛рдиреЗ рд╕реНрдерд╛рди рдкрд░ insert!()
рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдЬреЛрдбрд╝рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ insert!()
рдФрд░ рдПрдХ рддрддреНрд╡ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
function Base.insert!(deq::Deque{T}, i::Integer, val) where T i > 0 || throw(BoundsError(deq, i)) next = iterate(deq) for idx in 1:i-1 next тЙб nothing && throw(BoundsError(deq, i)) _, state = next next = iterate(deq, state) end if next тЙб nothing push!(deq, val) else record = next[2] new_node = DequeNode{T}(val) new_node.prev, new_node.next = record.prev, record record.prev = record.prev.next = new_node deq end end function Base.deleteat!(deq::Deque, i::Integer) i > 0 || throw(BoundsError(deq, i)) next = iterate(deq) for idx in 1:i-1 next тЙб nothing && throw(BoundsError(deq, i)) _, state = next next = iterate(deq, state) end if next тЙб nothing throw(BoundsError(deq, i)) else record = next[2] record.prev.next, record.next.prev = record.next, record.prev end end
рдЕрдиреНрдп
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ iterate()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП iterate()
рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, map()
, collect()
рдФрд░ рдХрдореА рдХреЗ рддрд░реАрдХреЗ рдЬреИрд╕реЗ sum()
рдпрд╛ minimum()
ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрддрд╛рд░ рдХреА рд▓рдВрдмрд╛рдИ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
Base.length(deq::Deque) = sum(x->1, deq) julia> length(Deque(1, 1, 2, 3, 5, 8, 13)) 7
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдХрдИ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХрдИ рдЖрд╢реНрд░рд┐рдд рдЕрдкрдиреЗ рдЖрдк рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рддреЛ, push!(container, element)
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ push!(container, element)
рдПрдХ рддрддреНрд╡ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ push!(container, elements...)
рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдПрдХ рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╣рдо рдЕрдореВрд░реНрдд рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
рд╣реИрдкреНрдкреА рд╣реИрдХрд┐рдВрдЧ!