簡體   English   中英

在C ++中迭代向量

[英]Iterating a Vector in C++

因此,根據我發現的其他示例,我被認為是對m_vect進行迭代的正確代碼:

for(vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)

但是,在嘗試編譯時,在該行上出現以下錯誤:

heap.h:167:6: error: need ‘typename’ before ‘std::vector<T>::iterator’ because ‘std::vector<T>’ is a dependent scope

就像我說的那樣,我從另一段代碼復制並改寫了該行,所以我真的不確定自己在做對與錯。 有見識嗎?

為了澄清,這是在模板函數中,我已經聲明了'template'。 m_vect是向量類型。 我不知道如何顯示小於和大於正確的顯示...

幸運的是,在C ++ 11中,您可以讓編譯器解決該問題。 編譯器已經知道m_vect是什么,因此您可以告訴它:

for (auto it= m_vect.begin(); ( it != m_vect.end()) ; ++ it ) { }

但是,等等,還有更多。 在c ++ 11中,您甚至可以遍歷m_vect所有m_vect

for (auto it : m_vect ) { }

您能告訴我,我認為在C ++ 03中進行迭代是瘋狂的,並且在現實生活中我從未見過有人這樣做,而在C ++ 11中,迭代效果要好上千倍?

這似乎是在模板函數中,而vector<T>::iterator是一種依賴於T的類型, T是模板參數。 由於可以使用任何不同類型的唯一定義來專門化模板,因此,在模板實際實例化之前,編譯器無法確定vector<T>::iterator是類型還是靜態成員。 如果它是靜態成員,那么從語法上講這沒有任何意義:

for(vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)

您需要做的就是告訴編譯vector<T>::iterator是一種類型。 為此使用typename

for(typename vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)

如果您讀取了錯誤,則可以看到這正是編譯器告訴您的。

T必須是實際類型。 它應該是向量中存儲的任何類型。 您的for循環看起來正確。 m_vect某處聲明了m_vect 迭代器需要與您聲明的m_vect相同的時間(當然m_vect加上::iterator )。

這是編譯器現在正在執行的更好的東西。

當使用從模板派生的東西時,必須通過添加typename來標記它是否被用作類型。 然后,如果編譯器知道(出於某種瘋狂的原因) vector<T>::iterator是一種方法,則它可以立即標記錯誤而不是進入未定義的行為。

因此,只需添加typename如消息所示:

for(typename vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)

如果您有足夠現代的編譯器,則可以將auto vector<T>::iterator替換為auto

否則,找到正確的類型以將T替換為您的向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM