2

同じタイプの質問を探しましたが、私の質問 (実存的な質問) に対する答えが見つかりませんでした: リスト内のオブジェクトを制御するには、どのタイプのフックを選択する必要がありますか? ポインターとイテレーターの間で迷っています。

コンテナは最初にいっぱいになり、その後サイズを変更するべきではありません。フックは、ユーザーの気まぐれでオブジェクトを切り替え、アルゴリズムで 1 つの変数のみを操作するために使用する方法です。

いずれの場合も、イテレータを調べて、フックする適切なオブジェクトを見つける必要があります。しかし、どれがベストプラクティス/使用ですか?

// 10 object list
std::list <Object> List(10);

std::list <Object>::iterator it = List.begin();
Object *pt = NULL;

// Select the 3rd object
advance(it, 3);
pt = &(*it);

// Access to object member...
it->member;
pt->member;

ポインターは、イテレーターとは異なり、近隣へのアクセスを許可しませんが、安全でない可能性があります。ベストプラクティスは何ですか?

4

3 に答える 3

2

「フック」で何をしたいかによって異なります。イテレータを使用すると、リスト内を前後に移動するための開始点として使用できます。ポインターを使用すると、リスト外のオブジェクトを指すこともできます。最終的には、コードがどのように進化するかによって異なります。

于 2013-07-16T08:29:48.147 に答える
1

ポインターまたはイテレーターをコンテナーに格納することは、それらを使用するまでに (つまり、コンテナーまたはデータが変更された場合に) 無効であることに気付く可能性があるため、非常に危険です。

より一般化された堅牢なアプローチは、リストの代わりにマップを使用することです。すべての値は (任意のタイプの) キーによって識別され、キーを簡単に保存して、使用する前にそれらが有効かどうかを確認できます。次に例を示します。

std::map<int, std::string> data;

// Add stuff to the map
data[5] = "blah";
data[27] = "foo";

// Check if a key exists
if (data.find(31) == data.end()) {
    // Key 31 does NOT exist
} else {
    // Key 31 DOES exist
}

ただし、マップはキー値で並べ替えられていることに注意してください。つまり、要素の順序が重要な場合は、キーを慎重に選択する必要があります。

于 2013-07-16T09:31:17.260 に答える
0

ほとんどの場合、参照を使用します。

Object& ref = *it;
ref.member

これはポインターのように動作します (関数の周りに自由に渡すことができます) が、ポインター演算を行うことはできません (ref++実際にはoperator++()on オブジェクトを呼び出します)。また、null から初期化することもできません (参照を作成しようとするとエラーとして報告されます)。

覚えておくべきことの1つは、オブジェクトをどこかに割り当てる必要があることです。ある関数がリストからオブジェクトを削除するとしたら、もう使用すべきではありませrefん。

于 2013-07-16T08:50:50.337 に答える