2012-01-06 3 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

Вы хотите distancehttp://www.cplusplus.com/reference/std/iterator/distance/

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

Я был бы склонен использовать разницу в итераторах произвольного доступа или использовать счет! Если итераторы не поддерживают вычитание, усилие в цикле становится квадратичным. Ведение счета имеет сравнительно невыносимые затраты. –

2

You может вычитать итераторы:

int distance = iter - agents.begin(); 

EDIT:

работает только для случайных итераторы доступа. (+1 интернет для Let_Me_Be)

+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' будет работать для любого прочитанного класса итератора. –

Смежные вопросы