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

我會傾向於只使用隨機訪問迭代器的區別或使用計數!如果迭代器不支持減法,循環中的努力變爲二次方。保持點數的成本相對可以忽略不計。 – 2012-01-06 13:21:40

2

可以迭代器。減去:

int distance = iter - agents.begin(); 

編輯:

僅適用於隨機訪問迭代器。 (+1互聯網Let_Me_Be)

+0

只適用於隨機訪問迭代器。 – 2012-01-06 13:22:06

+0

@Let_Me_Be我不知道。什麼是隨機訪問迭代器?問題中的一個是隨機訪問迭代器嗎? – 2012-01-06 13:23:53

+0

是的,它會在這種情況下工作,但它不會普遍工作。當然,問題在於,雖然這要麼在不變的情況下工作,要麼不起作用,但當迭代器不是隨機訪問迭代器時,距離將具有線性複雜度。 http://www.cplusplus.com/reference/std/iterator/RandomAccessIterator/ – 2012-01-06 13:25:45

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'將適用於任何已讀類的迭代器。 – 2012-01-06 16:58:52