2

私は Java 開発者です。私は現在C++を学んでいます。ソート用のコードサンプルを見てきました。Javaでは、通常、ソートメソッドにソートに必要なコンテナを指定します。

sort(Object[] someArray)

C++ では、コンテナーの開始と終了の 2 つの引数を渡すことに気付きました。私の質問は、実際のコンテナにどのようにアクセスするのですか?

これは、並べ替え方法を示すウィキペディアから取得したサンプル コードです。

#include <iostream>
#include <algorithm>
#include <vector>
int main() {
 std::vector<int> vec;
 vec.push_back(10); vec.push_back(5); vec.push_back(100); 
 std::sort(vec.begin(), vec.end());
 for (int i = 0; i < vec.size(); ++i) 
     std::cout << vec[i] << ' ';
}
4

5 に答える 5

3

vec.begin()そしてvec.end()イテレータイテレータを返しています。イテレータは要素の一種のポインタであり、イテレータを使用してそれらを読み取り、変更できます。それが、反復子を使用してソートが行っていることです。

反復子の場合、反復子が参照しているオブジェクトを直接変更できます。

*it = X; 

並べ替え関数はコンテナーについて知る必要はありません。これは反復子の機能です。ポインターを操作することで、コンテナーが何であるかを正確に知らなくても、完全なコンテナーを並べ替えることができます。

イテレータについて学ぶ必要があります ( http://www.cprogramming.com/tutorial/stl/iterators.html )

于 2013-02-05T21:06:40.040 に答える
2

vec.begin()vec.end()の最初と最後の要素を返さないでくださいvector実際にはiteratorと呼ばれるものを返します。イテレータは、要素へのポインタのように動作します。iで初期化した反復子がある場合、配列の最初の要素へのポイントがある場合と同じようvec.begin()に、ベクターの 2 番目の要素へのポインタを取得できます。同様に、後退するi++こともできます。i--一部の反復子 (ランダム アクセス反復子と呼ばれる) では、i + 5の後の 5 番目の要素への反復子を取得することもできますi

これは、アルゴリズムがコンテナーにアクセスする方法です。ソートする必要があるすべての要素が と の間にあることを認識していbegin()ますend()。単純なイテレータ操作を実行して、要素をナビゲートします。次に、 を実行することで要素を変更できます*i。これにより、アルゴリズムに、i指している要素への参照が与えられます。たとえば、iが に設定されている場合vec.begin()に を実行*i = 5;すると、 の最初の要素の値が変更されますvec

このアプローチでは、ソートする a の一部のみを渡すことができます。vectorの最初の 5 つの要素のみを並べ替えたいとしますvector。あなたがすることができます:

std::sort(vec.begin(), vec.begin() + 5);

これは非常に強力です。イテレータはポインタのように振る舞うので、実際には単純な古いポインタも渡すことができます。array があるとint array[] = {4, 3, 2, 5, 1};します。簡単に呼び出すことができますstd::sort(array, array + 5)(配列の名前は最初の要素へのポインターに減衰するため)。

于 2013-02-05T21:07:05.097 に答える
1

コンテナーにアクセスする必要はありませんこれが、標準テンプレート ライブラリ (C++ 標準ライブラリの一部となった) の背後にある設計の要点です。アルゴリズムは、コンテナーについては何も知らず、反復子だけを認識します。

これは、イテレータのペアを提供するものなら何でも使用できることを意味します。もちろん、すべての STL コンテナーはbegin()andend()メソッドを提供しますが、独自のイテレーターを作成するだけで、通常の古い C 配列、MFC コンテナー、glib コンテナーなどを使用することもできます。(そして、C 配列の場合は、開始イテレータと終了イテレータの場合aと同じくらい簡単です。)a+a_len

内部でどのように動作するかについて: イテレーターは暗黙のプロトコルに従います:++itイテレーターを次の要素に進める、*it現在の要素の値を取得する、または現在の要素*it = 3の値を設定するなどのことができます。(いくつかの異なるプロトコルがあるため、これよりも少し複雑です。反復子は、ランダムアクセスまたは前方専用、const または書き込み可能などにすることができます。しかし、それが基本的な考え方です。)それ自体を反復子プロトコルに (そしてもちろんそうです)、そのプロトコルに準拠するものすべてで動作します。

詳細については、インターネット (および書店) に多数のチュートリアルがあります。SOの答えで説明できることは限られています。

于 2013-02-05T21:07:27.113 に答える
0

begin()そしてend()イテレータを返します。たとえば、http ://www.cprogramming.com/tutorial/stl/iterators.html を参照してください。

于 2013-02-05T21:06:49.277 に答える
0

イテレータは、コンテナの一部への参照のように機能します。つまり*iter = z;、コンテナー内の要素の 1 つを実際に変更します。

std::sort含まれているオブジェクトへの参照で実際にswap関数を使用するため、既に初期化した反復子は同じ順序のままですが、それらの反復子が参照する値は変更されます。

std::listと呼ばれるメンバー関数もあることに注意してくださいsort。これは逆に機能します。すでに初期化したイテレータはすべて同じ値を保持しますが、それらのイテレータの順序は変更されます。

于 2013-02-05T21:10:59.753 に答える