2009-04-08 7 views
1

私はベクトルを継承し、いくつかの追加機能を持つこの新しいクラスSeqを持っています。私はSeqとベクトルのすべてのメソッドを使用することができます。私はsweepEventsにそれのための要素ベクトルのエッジ探索を取り、sweepEventsで見つかった要素の位置にイテレータを返す関数を持つようにしたいベクトルのイテレータを返す関数

Seq< vector<int> > sweepEvents; 

(のみの場合と:このデータ構造を有する

edgeが見つかった場合)、ベクトルの最後の要素に対するイテレータ(edgeが見つからない場合のみ)。

次に、イテレータの前の位置と次の位置から要素を比較したいという点で、このイテレータを使用したいと思います。

私はイテレータを創設し、返すための以下の機能を持っている:

Seq< vector<int> >::iterator QSweep::insertSweepEvents(edge_t edge,int currentDim){ 
    int changePosition; 
    int found=0; 

    for (int i=0;i<currentDim;i++){ 
     if (edge[0]==sweepEvents[i][1]){ 
      changePosition=i; 
      found=1; 
      return sweepEvents.begin()+changePosition; 
     } 
    } 
    if (found==1){ 
     sweepEvents.rep().insert(sweepEvents.begin()+changePosition,edge); 
     sweepEvents.rep().erase(sweepEvents.begin()+changePosition+1); 
    } 
    else{ 
     sweepEvents.rep().insert(sweepEvents.end(),edge); 
    } 

    return sweepEvents.end()-1; 
} 

私は、メイン機能で、このイテレータを呼び出します。私は実際に試してみましたが、それはコンパイルできないと私は、これ以外の使用するためにどのような構文を知らない:

int main(){ 
    Seq< vector<int> > sweepEvents; 
    vector<int> edge; 
    //.....initialize sweepEvents and edge 

    //declare iterator but not working 
    Seq< vector<int> >::iterator comparePosition; 

    //not working neither 
    comparePosition=insertSweepEvents(edge,sweepEvents.size()); 
} 

私が正しくイテレータを呼び出す必要があります方法上の任意のアイデア?私はそれが配列から整数インデックスとして動作しない参照してください?

+0

を返すときにのみ設定されている変数を使用しています「働かない」という意味ですか?悪い結果、コンパイラエラー、コア? – bayda

+0

comparePositionの定義とその後のcomparePositionの割り当てのコンパイラエラー。 – madalina

+0

find = 1を設定したときに戻るので、if(found == 1)ブロックは実行されません。 コンパイラのエラーはどのコンパイラで取得できますか? – mentat

答えて

0

コード内に何か不公平があります。私のコメントを参照してください:

int found = 0; 
for (int i=0;i<currentDim;i++){ 
    if (edge[0]==sweepEvents[i][1]){ 
       changePosition=i; 
       found=1; 
// This place is one, where we assign 1 to found, and we do return after that (maybe you want do break/?) 
       return sweepEvents.begin()+changePosition; 
     } 
} 
if (found==1){ // as you see we reach this place only when found == 0 
+0

を見せるので、私は自分が望むものを創ることに問題はありません。 私はその要素がリストにないと考えました!! 次に、新しい要素とすべての要素を比較します。見つかった場合は、その要素を見つけてその位置に戻します。 それから私のベクトルの終わりではない場合、私は正しい位置に挿入されています。 – madalina

+0

多分それは主な問題ではありませんが、とにかくブロックの場合はこれを取り除くことができます。また、見つかった変数を削除することもできます。 – bayda

+0

私が見つけた場合は、見つかった要素が目的の位置に追加され、最後の位置に追加されます。 – madalina

1

コンパイルエラー?どのように定義されますSeq<X>::iterator

#include <vector> 

template<typename T> 
struct Seq 
    : public std::vector<T> 
{ }; 

typedef Seq< std::vector<int> > SeqI; 

SeqI::iterator insertSweepEvents(SeqI &s) 
{ 
    return s.begin(); 
} 

int main() 
{ 
    SeqI s; 
    SeqI::iterator e = insertSweepEvents(s); 
} 

これは問題なく動作します。

+0

SeqIは私のデータ型ですので、私の関数のパラメタとして、私のsweepEventsリストのアドレスも必要ですか? – madalina

+0

いいえ、しかし、あなたが返すイテレータが有効であるように、参照を処理する必要があります。 –

+0

私は見るベクトルと非常によく似ています。 これで、e(正しい位置のイテレータ)が得られました。どのようにして、要素を位置sから、または位置から印刷できますか? – madalina

2

Seq <ベクトル< Seqクラスで定義されているイテレータ?

vectorをする場合は特に、変更された後:テンプレート「ベクトル」のパラメータは、それはタイプのSeq <ベクトル<整数>> ::イテレータ

0

少し追記が存在する意味するものではありません作る

追加または挿入されたイテレータは無効になります。これは、vectorが、内部データ用に最小サイズの連続したメモリブロックを割り当てようとしていると同時に、新しい大きなチャンクを割り当てる必要がある回数を最小限に抑えようとするためです。したがって、データはメモリを移動する可能性があります。そのため、反復子の前にはがあります。pushは有効でなくなりましたの後にです。

もうちょっと注:

あなたはstd::difference(it1, it2)を使って、2回の反復子の違いを見つけることができます。 std::advance(it1, d)を使用してその差を再適用することができます。

第三の小さなノート:

あなたは、forループ内で「リターン」ステートメントを持っているように見えるが、コードの残りの部分は何...

関連する問題