在for循环中修改两个相同类型的向量

时间:2016-08-18 11:49:27

标签: c++ vector

我想在同一个循环中修改存储在两个相同类型T的向量中的值。 例如,假设我有两个整数向量:

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

现在我想同时遍历这两个向量,现在只显示每个值。例如:

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

我怎样才能实现这一目标?

3 个答案:

答案 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;
}

答案 1 :(得分: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

答案 2 :(得分: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;
}