2012-01-06 16 views
1

イテレータのカウント数を得る方法はありますか?最初に私は、この持っていた場合イテレータのインデックス作成

ので:インデックス()整数を設定することを念頭に置いて

for (int i = 0; iter < agents.size(); ++i) 
{ 
    agents[i]->Index(i); 
} 

ベアリングを、どのように私はこれはイテレータをどうでしょうか?

for (std::vector<Agent*>::iterator iter = agents.begin(); iter < agents.end(); ++iter) 
{ 
    (*iter)->Index(????) 
} 

答えて

6

あなたは、あなたはでき substractイテレータdistancehttp://www.cplusplus.com/reference/std/iterator/distance/

(*iter)->Index(distance(agents.begin(),iter)); 
+4

私はランダムアクセスイテレータの違いを使用するか、またはカウントを使用する傾向があります。反復子が減算をサポートしない場合、ループ内の努力は二次的になります。カウントを維持することは、比較的無視できるコストです。 –

2

をしたい:

int distance = iter - agents.begin(); 

EDIT:

のみ、ランダムアクセスイテレータのために働きます。 (Let_Me_Beに+1インターネット)

+0

ランダムアクセスイテレータでのみ動作します。 –

+0

@Let_Me_Be私はそれを知らなかった。ランダムアクセス反復子とは何ですか?質問にあるものはランダムアクセス反復子ですか? –

+0

はい、この場合は動作しますが、普遍的には機能しません。もちろん、問題は、これが一定時間内に動作するか、動作しない一方で、イテレータがランダムアクセス反復子でない場合に距離が線形複雑になることです。 http://www.cplusplus.com/reference/std/iterator/RandomAccessIterator/ –

1

は、最も一般的に、あなたは常に自分で何かをハックすることができます:あなたは、ランダムアクセスイテレータを持っている場合は、すでに述べてきたよう

{ 
    int i = 0; 
    for (auto it = agents.begin(), end = agents.end(); it != end; ++it, ++i) 
    { 
     (*it)->set_int(i); 
    } 
} 

、あなたは確かに、安全にstd::distance(agents.begin(), it)を使用することができます。

+0

ランダムアクセスのイテレータがある場合、 'std :: distance'は必要ありません。ちょうど引くことができます。 'std :: distance'はイテレータの任意の読み込みクラスに対して動作します。 –