2016-08-18 68 views
2

我想修改存儲在同一個循環中相同類型T的兩個向量中的值。 例如,說我有個整數的兩個向量:在for循環中修改相同類型的兩個向量

std::vector<int> student_ids; 
std::vector<int> teacher_ids; 

現在我想通過這兩個向量循環的同時,並簡單地顯示每個值了。例如:

for(int id : student_ids, teacher_ids) 
{ 
    std::cout << id << "\n"; 
} 

我該怎麼做到這一點?

+0

使用簡單的'for'沒有基於範圍的循環 – malchemist

+0

使用良好的ol'for循環或提升:: zip – bolov

+0

你不能,你必須使用其他方法(兩個循環?循環使用索引?) –

回答

1

通過這種方式,您可以在一個循環中迭代兩個向量,但請記住檢查兩個向量的大小是否不相同

std::vector <int>::iterator it1 = student_ids.begin(); 
std::vector <int>::iterator it2 = teacher_ids.begin(); 

while(it1 != student_ids.end() || it2 != teacher_ids.end()) { 
    if(it1 != student_ids.end()) { 
     std::cout << "Student: " << *it1 << std::endl; 
     ++it1; 
    } 
    if(it2 != teacher_ids.end()) { 
     std::cout << "Teacher: " << *it2 << std::endl; 
     ++it2; 
    } 
} 

否則,如果你是確保大小兩個載體是相同,只需更換||&&,你可以做掉循環這樣的內if條件:

for(; it1 != student_ids.end() && it2 != teacher_ids.end(); ++it1, ++it2) { 
    std::cout << "Student: " << *it1 << std::endl; 
    std::cout << "Teacher: " << *it2 << std::endl; 
} 
+0

謝謝,我認爲這是我正在尋找的!我現在可能會這樣實施它。 – Spook

+0

@ Jarod42更改了循環。 – Shubham

0

如果您要訪問同時在你的循環體中兩個向量,唯一的辦法是正常的:

for (size_t i=0; i<std::max(student_ids.size(),teacher_ids.size()); i++) { 
    if (i<student_ids.size()) // are there still students ? 
     cout << student_ids[i]; 
    cout <<" : "; 
    if (i<teacher_ids.size()) // are there still teachers ? 
     cout << teacher_ids[i]; 
    cout<<endl; 
} 

但我從你的例子中明白,你正在尋找遍歷兩個向量,按順序,並且你正在尋找一種方便的方法來避免冗餘代碼。

如果你不想寫,因爲一個非常複雜的身體的兩個環一前一後,如果你不想把這個身體變成一個功能,因爲獲得了大量的局部變量作拉姆達出來的:

auto f = [&](int& id) { cout << id<<endl; }; // could be more complex ! 
for_each(student_ids.begin(), student_ids.end(), f); 
for_each(teacher_ids.begin(), teacher_ids.end(), f); 

另外,您可以使用臨時合併向量來遍歷:

auto temp(student_ids); 
copy(teacher_ids.begin(), teacher_ids.end(), back_inserter(temp)); 
for (auto &id : temp) 
    cout << id<<endl; 

Online demo

0
auto studentIterator = student_ids.begin(); 
auto teacherIterator = teacher_ids.begin(); 
auto studentIteratorEnd = student_ids.end(); // for tiny performance 
auto teacherIteratorEnd = teacher_ids.end(); // the same 

while (true) 
{ 
    if (studentIterator != studentIteratorEnd) 
    { 
    std::cout << *studentIterator << std::endl; 
    ++studentIterator; 
    } 
    if (teacherIterator != teacherIteratorEnd) 
    { 
    std::cout << *teacherIterator << std::endl; 
    ++teacherIterator; 
    } 
    if (studentIterator == studentIteratorEnd && teacherIterator == teacherIteratorEnd) 
    break; 
}