underestimateCount
ist eigentlich eine Forderung des Sequence
Protokoll und hat a default implementation, die gerade wieder 0
:
public var underestimatedCount: Int {
return 0
}
für Sequenzen jedoch, die ihre eigene Implementierung von underestimatedCount
liefern, kann dies für die Logik nützlich sein, die eine braucht Untergrenze, wie lange die Sequenz ist, ohne dass sie durchlaufen werden muss (bedenken Sie, dass Sequence
keine Garantie für eine nicht-destruktive Iteration gibt).
Zum Beispiel kann die map(_:)
Methode auf Sequence
(see its implementation here) verwendet underestimateCount
, um eine Anfangskapazität für die resultierende Anordnung zu reservieren:
public func map<T>(
_ transform: (Iterator.Element) throws -> T
) rethrows -> [T] {
let initialCapacity = underestimatedCount
var result = ContiguousArray<T>()
result.reserveCapacity(initialCapacity)
// ...
Dies ermöglicht map(_:)
die Kosten der wiederholt auf die result
anhängt, zu minimieren, da ein erster Speicherblock (möglicherweise) bereits für ihn reserviert wurde (obwohl es auf jeden Fall erwähnenswert ist, dass ContiguousArray
eine exponentielle Wachstumsstrategie hat, die die Kosten des Anhängens amortisiert).
jedoch im Falle eines Collection
, the default implementation von underestimateCount
tatsächlich gibt nur die Sammlung des count
:
public var underestimatedCount: Int {
// TODO: swift-3-indexing-model - review the following
return numericCast(count)
}
die ein O (1) -Operation für Sammlungen werden, die RandomAccessCollection
, O (n) entsprechen Andernfalls.
daher aufgrund dieser Standardimplementierung, ein Collection
mit ‚s underestimatedCount
direkt ist auf jeden Fall weniger verbreitet als ein Sequence
mit‘ s, als Collection
garantiert zerstörungs Iteration, und in den meisten Fällen underestimatedCount
wird nur die count
zurück.
Natürlich können benutzerdefinierte Sammlungstypen ihre eigene Implementierung von underestimatedCount
- geben eine untere Grenze, wie viele Elemente sie enthalten, in einer möglicherweise effizienteren Weise als ihre Implementierung, die möglicherweise nützlich sein könnte.
Mögliches Duplikat von [Wie holt man die Elementanzahl eines Typs, der \ SequenzTyp \? Entspricht?] (Http://stackoverflow.com/questions/28752743/how-does-one-retrieve-the- element-count-of-type-konform zum Sequenztyp). Die Antwort in den verlinkten Q & A beschreibt, dass wir einige 'Sequence' zählen müssen: s müssen wir iterativ seinen Generator benutzen (swift 3: Iterator). Wenn Sie den Iterator verwenden, um die Anzahl der Elemente explizit zu zählen, wird die Sequenz in einigen Fällen tatsächlich konsumiert und zerstört. 'subsomateCount()' verspricht, eine Zählung zurückzugeben, die nicht größer als die tatsächliche ist. – dfri
... und wie auch in der Antwort beschrieben, wird 'subsumateCount() 'für Sequenzen, die Sammlungen sind, tatsächlich die tatsächliche Anzahl zurückgeben. – dfri
@dfri Diese Frage ist anders, und außerdem beantwortet diese Antwort meine Frage nicht, während Hamish tut. Ähnliches Thema! = Identisch. – KlimczakM