2016-11-24 14 views
0

std :: listの要素の位置を提供するオーバーロードされたブラケット演算子を作成する方法を知りました。std :: listのオーバーロードされたブラケット演算子

次のように私のクラスのリスト宣言は次のとおりです。

std::list<Stimulation*> configuration; 

オーバーロードされたブラケット演算子の宣言は次のとおりです。

std::list<Stimulation*>::operator[](const int); 

私は次のようにブラケットオペレータのdefintionは行くだろうと理解します:

std::list<Stimulation*>::operator[](const int position) 
{ 
    auto i = configuration.begin(); 
    return i + position; 

    ***OR*** 

    std::list<Stimulation*>::iterator i = configuration.begin(); 
    return i + position; 
} 

私はこのコンセプトには新しいので、どんな助けでも感謝しますこれを行う正しい方法で縛られている。この状況では、他のコンテナにライブラリの一部としてブラケット演算子が含まれていることを知っているので、リストを特に使用する必要があります。あなたの忍耐と時間をもう一度ありがとう。

+0

なぜ 'list'にブラケット演算子がないのでしょうか。これは、要素から要素へ移動する必要があるためです。したがって、O(n)アクセスです。 'for'を使ってループしなければなりません。反復している要素の数を数える必要があります。 –

+0

それはできません。 –

+0

ya私はそれを読んだが、私が得ているこの仕様はそれを求めているので、正確に何をするのか分からなかった。 –

答えて

4

std::list要素がstd::vector要素と異なり、連続していないので、効率が悪くリストが作成される理由ではないため、[]演算子は存在しません。

しかし、練習として、forループで実装することができます。ここでconstバージョンを欠いている、私の素朴な実装だし、範囲外の時にアサーションで失敗:あなたはlist::begin()に位置を追加することはできませんので、要素はリストの最後(O(N))である場合

#include <list> 
#include <iostream> 
#include <cassert> 

using namespace std; 

class MyList : public list<int> 
{ 
public: 

    int &operator[](int pos) 
    { 
     int count=0; 
     for (auto &it : *this) 
     { 
      if (count==pos) { return it;} 
      count++; 
     } 
    assert(false); 
    } 
}; 


int main() 
{ 
    MyList l; 
    l.push_back(1); 
    l.push_back(2); 
    l.push_back(3); 
    l.push_back(4); 
    cout << l[2] << endl; 
    return 0; 
} 

アクセス時間が非常に悪いです。

最後に頼まれたオフセット&イテレータを "キャッシュ"して、呼び出し元がoffset + 1(プログラムで頻繁に使用される)を要求した場合、最初から再開せずに進むことができます。

注:ちょうど約std::advanceのコメントを見た。そこでは使用されませんでした(それを知らなかった)。

+0

これは私が感謝のために探していたものの多くです。このコースは、私が推測していることが正しく働くかどうかという理論的側面を本当に理解するためのものです。時間を感謝します。 –

+1

このようなことをする方法を知っているのはまだ興味深いですね。以前の私の同僚は、ディレクトリをファイル名で連結するカスタム文字列クラスの除算演算子を定義する考えがありました。結果は非常に読みやすい: 'dirname/basename'は除算とは何の関係もなかった。 –

+0

それは間違いなく興味深いものです。そして、あなたが実装する言語と考えられるアイデアを得ることができる多くの方法を考えていることは間違いありません。再度、感謝します! –

関連する問題