2009-02-27 102 views
1
std::vector< std::vector<coords> >::iterator iter; 
for(iter = characters.begin(); iter != characters.end(); iter++) 
{ 
    std::vector<coords>* cha = iter; // doesn't work. 
} 

// does work. 
std::vector<coords>* character = &characters.at(0); 
coords* first = &character->at(0); 

而我不明白爲什麼。它不應該是一個指向容器應該「包含」的類型元素的指針嗎?通過迭代器訪問另一個矢量內的矢量元素?

任何人都願意闡明這一點?

通過不工作我的意思是:

error C2440: 'initializing' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'std::vector<_Ty> *' 

不使一大堆的道理給我。

回答

6

迭代器是一種可以像指針一樣取消引用的類型,即它具有明確的operator*()operator->()。它不一定是一個指針。

因此,如果您想獲取矢量的地址,請使用&*iter

3

爲了進一步闡明MSN的答案,您可以將迭代器看作是容器中單個項目的包裝,但它也有一些智能用於遞增(++ iter),遞減(++ iter)等。請記住,底層數據結構可能不是連續的內存塊,具體取決於容器類型/實現。要訪問的實際值,則可以

1)反引用迭代器,例如

Type t = *iter;

2)治療所述迭代器作爲指針到容器類型,例如

iter->someFuncOnTheContainerType();

1

我知道現在很明顯(事後看來),但在您的for循環中,您也可以嘗試:

std::vector<coords> & cha = * iter; 

此外,不是你要求的,只是FYI,但矢量支持隨機訪問迭代器。這意味着你也可以這樣寫:

for(size_t i=0; i<characters.size(); i ++) 

而且,如果你需要轉換回一個迭代器,你可以使用:

characters.begin() + i 

這不是做事的C++方式,它打破了通用的迭代哲學,但它有其用途。