7

イテレータが指すコンテナを見つける方法はありますか?具体的には、特定のベクトルへの参照を実際に渡さなくても範囲を確認できるようにstd::vector、特定のポイントが指しているものを見つけられるようにしたいです。std::vector::iterator

(私が思うに)答えがノーなら、なぜですか?

編集:多くの迅速で(大部分は)正確な回答に感謝します。エヴァン・テランはそれを釘付けにします。最適化についてはまったく考えていませんでしたが、今では明らかです。

何人かの人が私がこれを何のためにやりたいのか尋ねました。それはそれほど重要なことではありません。ベクトルで初期化されたオブジェクトと、ベクトルを指すイテレータがあります。イテレータだけでオブジェクトを初期化できれば、vector::iteratorsをこのオブジェクトに直接変換できるので、かわいくて便利です(これは奇妙に聞こえますが、特定の場合には意味があります)。しかし、それはまったく重要ではありません。

4

7 に答える 7

8

私はそうは思わない。イテレータが所有するコンテナへの参照/ポインタを保持する必要がある場合、軽量ポインタまで最適化することは不可能です(これは、ベクトルなどの連続したストレージを保証するコンテナで実行できます)。

于 2008-12-17T18:48:48.660 に答える
5

それを機能させる方法はありません。理由は簡単です。イテレータが指しているコンテナを取得する方法をイテレータに追加するのは、

  • 無意味。イテレータは、コレクションを反復処理します。他の人が言ったように、それだけです。
  • イテレータ要件と互換性がありません。ポインターはランダム アクセス反復子であることを忘れないでください。コンテナー ポインターをイテレーターに入れても、アルゴリズムには何の役にも立たないでしょう。なぜなら、それらはジェネリックであり、特定のイテレーターの実装から切り離されることを意図しているからです。反復子として使用されるポインターは、メンバーとして取得された配列へのポインターを持つことはできません。

範囲チェックに必要だと言います。範囲の最後の有効なイテレータ位置の 1 つ後を指す終了イテレータを指定できます。現在の位置が最後ではないかどうかを確認します。範囲チェックに必要な作業はこれだけです。

于 2008-12-17T19:21:27.940 に答える
3

一般的な方法でイテレータからコンテナを取得することはできません。理由の例として、プレーンポインタをイテレータとして使用できます。

#include <algorithm>
#include <cstdio>
#include <cstring>

int
main(int argc, char *argv[])
{
        const char s[] = "Hello, world!";
        const char *begin = s;
        const char *end = s + strlen(s);

        std::for_each(begin, end, putchar);

        return 0;
}

ポインタから元の文字列を取得するにはどうすればよいですか(文字列の先頭が指定されていない場合)。

ただし、この機能が必要な場合は、コンテナーへの参照を格納するイテレーターの周りに独自のラッパーをいつでも実装できます。

于 2008-12-17T18:56:24.790 に答える
2

理論的には、問題の反復子が少なくとも前方反復子である場合に方法があります。各候補コンテナーのイテレーターが [first,last) のイテレーターの 1 つであるかどうかを確認できます。ベクター コンテナーを使用しているため、ランダム アクセス イテレーターがあり、less-than 演算子を使用してこのチェックをすばやく行うことができます。

前もってチェックする候補ベクトルをすべて知っておく必要があります。これは、反復子が属するコンテナーを取得する一般的な方法ではありません。

ただし、作成中のベクトルへのポインターを含む何かでランダム アクセス反復子を装飾することにより、ランダム アクセス反復子の拡張を定義できます。これは、少し洗練されておらず、非効率的で、不便である可能性があります。そのため、最初にこの必要性を回避するためにコードを書き直すことができるかどうかを確認してください。

于 2008-12-17T18:58:21.543 に答える
1

STL はこれを許可していません。

たとえば、ベクトル反復子は、単純にポインターとして実装できます。また、オブジェクトが割り当てたデータを指すポインターからオブジェクトを取得する一般的な方法はありません。

于 2008-12-17T19:09:07.153 に答える
0

私はそれを行うための公開された方法があるとは思わない。その理由は、それがイテレータの目的ではないからです。もちろん、イテレータがその親コン​​テナへのポインタを保持できなかったという技術的な理由はありません。そのポインタを必要としない方法で実装されたとしても、それを保持することができます。

イテレータは、コレクションを反復処理することを目的としているため、それを実行するために必要なインターフェイスを提供します。これは、優れたオブジェクト指向プログラミングの原則です。

イテレータを使用してコンテナの「範囲」を知る必要があるというユースケースを教えてください。

于 2008-12-17T18:54:53.907 に答える
0

前述のように、この動作が不要になるようにコードを書き直すことをお勧めします。コインを持っているのと同じですが、紙に書き留めない限り、どこから来たのかわかりません。

コードを書き直すことができない場合でも、コンテナーへのポインターとイテレーター自体を含むラッピング オブジェクトを導入できます。これは具体的に何のために必要ですか?

于 2008-12-17T19:16:35.233 に答える