「(a) A と D の間のリンクはどのように確立されますか。つまり、A はどのように D のコンポーネントにアクセスしますか?例を挙げてください。」
これはイテレータを介して行われます。イテレータは、STL のアルゴリズムとデータ構造の間の接着剤です。私の例では c++11 を使用します。
std::vector<int> vec{1, 5, 3, 4};
std::list<int> l{1, 4, 8, 3};
auto foundInVecItem = std::find(vec.begin(), vec.end(), 3);
//Note: same algorithm used for different data structure.
auto foundInVecItem = std::find(l.begin(), l.end(), 3);
これが機能std::find
するのは、検索に使用しているデータ構造について想定していないためです。ForwardIterator
この概念を実装に使用します。ここでイテレータのカテゴリを確認できます。
std::find
次のようなものを実装できます(学習用であるため単純化されています):
template <class ForwardIterator>
ForwardIterator find(ForwardIterator b, ForwardIterator e,
typename ForwardIterator::value_type v) {
while (b != e) {
if (*b == v) {
return b;
}
}
return e;
}
ここで重要な点は、 iterator インターフェイスがstd::list
orの要素にアクセスするために使用されているstd::vector
ため、アルゴリズムが s を提供する限り、データ構造を気にしないことForwardIterator
です。
「(b) STL は、A を D で使用した結果について何かを保証します (つまり、約束します)。保証とは何ですか?」
すみません、これは一般的すぎます。その質問はどういう意味ですか? ビッグ O 表記、つまり漸近的な計算コストのことを言っているのであれば、そうです。標準では、データ構造が与えられると、アルゴリズムごとに制限付きの Big O コストが約束されます。アルゴリズムとデータ構造に依存します。たとえばstd::advance
、イテレータをいくつかのステップだけ進める は、 s およびそれらの残りの部分であることが保証されてO(1)
いRandomAccessIterator
ますO(n)
。
"A) STL には、データ構造の要素にアクセスするためのさまざまな "反復子" も用意されています。さまざまな種類の反復子があり、最初から最後まで直線的に移動できるものもあれば、両方向に移動できるものもあれば、自由に移動できるものもあります。 D の任意の要素。D がサポートする反復子の型によって、D を使用して実行できる A の型が決まります。"
ここでイテレータのカテゴリを確認できます。
「B) A を D で実行できる場合、STL は A を完了するのにかかる時間の複雑さ (O(n)) を保証します。」
はい、そうです。この仕様は、データ構造が与えられた操作の漸近的な計算コストを保証します。