7

Swiftでサブシーケンスを扱うとき、

func suffix(from: Int)just と同じようですdropFirst(_:)(明らかに、長さ「10」の配列の場合、入力値を「3」から「7」に変更するだけです。)

それを繰り返すだけです。したがって、もちろん、たとえば長さ 10 の配列の場合です。つまりfunc suffix(from: Int)dropFirst(_:)、たとえば"2" は"8" と同じです。

同様にupTo/throughと同一のようですdropLast(_:)

利便性以外に違いはありますか?

(おそらく、エラー状態、パフォーマンス、または?)

実際、Swift の内部で、どちらか一方が他方を呼び出すことによって実装されているだけなのか疑問に思っていました。

4

3 に答える 3

8

それらは完全に異なります。

  • suffix(from:)

  • dropFirst(_:)

    • Sequenceプロトコルによって定義されます。
    • SubSequenceシーケンスの先頭から指定された最大数の要素を削除したを返します。
    • O(n)* の文書化された時間の複雑さがあります。そのデフォルトの実装は実際には O(1) の時間の複雑さを持っていますが、これは、反復までドロップされた要素を O(n) ウォークスルーするだけです。
    • 入力した数値がシーケンスの長さより大きい場合は、空のサブシーケンスを返します。

*すべてのプロトコル要件が文書化された時間の複雑さと同様に、準拠する型がより低い時間の複雑さで実装される可能性があります。たとえば、 aRandomAccessCollectiondropFirst(_:)メソッドは O(1) 時間で実行されます。


ただし、 に関して言えばArray、これらのメソッドはたまたま同じように動作します (範囲外の入力の処理を除く)。

これは、 が から始まり、 まで順番にカウントされる型をArray持っているためです。したがって、最初の要素が削除されたサブシーケンスは、インデックス から始まるサブシーケンスと同じであることを意味します。IndexInt0array.count - 1nn

また、ArrayであるためRandomAccessCollection、両方のメソッドが O(1) 時間で実行されます。

于 2016-11-02T22:54:03.090 に答える
2

それらが接続されていることは正しいですが、違いがあります。ドキュメントから:

let numbers = [1, 2, 3, 4, 5]
print(numbers.suffix(2))
// Prints "[4, 5]"
print(numbers.suffix(10))
// Prints "[1, 2, 3, 4, 5]"

let numbers = [1, 2, 3, 4, 5]
print(numbers.dropFirst(2))
// Prints "[3, 4, 5]"
print(numbers.dropFirst(10))
// Prints "[]"

最初の例では、suffix(2) は最後の2 つの要素のみを返しますが、dropFirst(2) は最初の2 つの要素を除くすべてを返します。同様に、それらは動作が異なります。シーケンスよりも長い引数は長いです。(さらに、サフィックスは有限シーケンスでのみ機能します。)

同様に、prefix と dropLast も同様です。別の考え方として、長さ n のシーケンスの場合、prefix(k) == dropLast(nk)、ここで k <= n です。

于 2016-10-30T21:00:26.217 に答える
2

IMO の最大の違いはdropFirst()、コードが範囲外のインデックス エラーにさらされないことです。したがって、 /メソッドは空の配列または範囲外のパラメーターでクラッシュする可能性がありますがdropFirst、空の配列ではどちらの形式でも安全に使用できます。prefixsuffix

したがってdropFirst()、クラッシュではなく利用可能な要素よりも多くの要素を指定したときに空の配列結果を好む場合、または使用するインデックスがarray.countなど

概念的には、それが存在する場合firstは最初の要素を返すオプション型のプロパティであることを考えると、これは名前付きの操作にとって理にかなっていると思います。言うことは、「おそらく存在する最初の要素が存在する場合は削除し、それを3回行う」ことを意味しますdropFirst(3)

于 2016-11-02T21:15:27.840 に答える