2011-02-03 74 views
36

我有一個學生有一個字段名稱的矢量。如何迭代常量向量?

我想遍歷向量。

void print(const vector<Student>& students) 
    { 
    vector<Student>::iterator it; 
    for(it = students.begin(); it < students.end(); it++) 
     { 
      cout << it->name << endl; 
     } 
    } 

這在C++中顯然是非法的。

請幫忙。

+2

請閱讀有關前綴與後綴增量運算符。 `it ++`應該是`++ it`,在少數情況下需要`it ++`(即迭代時擦除)。 – 2011-02-03 19:10:13

+2

它在這種情況下很明顯是什麼問題。但是,將來你應該在你的問題中包含編譯器給你的確切錯誤信息。 – 2011-02-03 19:13:48

回答

53

你有兩個(三個C++ 11)選項:const_iterator S和指數(+ 「範圍,爲」 在C++ 11)

void func(const std::vector<type>& vec) { 
    std::vector<type>::const_iterator iter; 
    for (iter = vec.begin(); iter != vec.end(); ++iter) 
    // do something with *iter 

    /* or 
    for (size_t index = 0; index != vec.size(); ++index) 
    // do something with vec[index] 

    // as of C++11 
    for (const auto& item: vec) 
    // do something with item 
    */ 
} 

你應該更喜歡使用!=代替<與迭代器 - 後者不適用於所有迭代器,前者將會。對於前者,你甚至可以使代碼更通用的(這樣你可以甚至改變容器類型不接觸環路)

template<typename Container> 
void func(const Container& container) { 
    typename Container::const_iterator iter; 
    for (iter = container.begin(); iter != container.end(); ++iter) 
    // work with *iter 
} 
16

改爲使用const_iteratoriterator允許修改vector,因此您不能從const容器中獲得一個。

此外,編寫此循環的慣用方法使用it != students.end()而不是<(儘管這應該在vector上工作)。

+2

...但如果您決定更改爲使用`list`或類似的東西,您的代碼將無法工作。所以使用`!=`表單。 – 2011-02-03 19:11:13

2
void print(const vector<Student>& students) 
    { 
    vector<Student>::const_iterator it; // const_iterator 
    for(it = students.begin(); it != students.end(); it++) 
     { 
      cout << it->name << endl; 
     } 
    } 
3

相反的vector<Student>::iterator,使用vector<Student>::const_iterator

2
void print(const vector<Student>& students) 
    { 
    for(auto it = students.begin(); it != students.end(); ++it) 
     { 
      cout << it->name << endl; 
     } 
    } 
+1

這個問題沒有標籤C++ 0x – smerlin 2011-02-03 19:10:32

1

C++ 11風格:

void print(const vector<Student>& students) { 
    for(auto const& student : students) { 
      cout << student.name << endl; 
    } 
}