如何按顺序迭代几个容器?

时间:2017-01-11 16:39:22

标签: c++ loops boost iterator containers

具有以下类似的代码:

#include <iostream>
#include <vector>

int main()
{
  std::vector<std::string> v1, v2;
  for (const auto& s : v1) {
    // do something with s
  }
  for (const auto& s : v2) {
    // do something with s
  }
}

我想一次性遍历来自v1v2的所有元素(因为逻辑在这些循环中很难,我不能在其中使用函数 - 为此问题)。

所以理想的解决方案就是:

  for (const auto& s : magic(v1,v2)) {
    // do something with s
  }

显然没有分配新容器并且复制了所有元素(因为这个解决方案很简单。

是否有类似的东西,例如在boost

3 个答案:

答案 0 :(得分:2)

使用range-v3,您可以

#include <GL/gl.h>
#include <GL/glut.h>
#include <stdlib.h>

void initGL(int width, int height)
{

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,2.0f, 100.0f);
 glMatrixMode(GL_MODELVIEW);
}
static void display(void)
{

glLoadIdentity();
glPushMatrix();
    glTranslatef(0.0,0.0,-10);
    glRotatef(60,1,0,0);
    glRotatef(60,0,1,0);
    glutSolidCube(2);
glPopMatrix();

glFlush();
}

static void idle(void)
{
glutPostRedisplay();
}

int main(int argc, char *argv[])
{

int width = 640;
int height = 480;

glutInit(&argc, argv);
glutInitWindowSize(width, height);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutCreateWindow("GLUT cube");

glutDisplayFunc(display);
glutIdleFunc(idle);

initGL(width, height);

glutMainLoop();

return EXIT_SUCCESS;

}

Demo

答案 1 :(得分:1)

这是一个使用higher-order function的解决方案:

template <typename TC0, typename TC1, typename TF>
void forJoined(TC0&& c0, TC1&& c1, TF&& f)
{
    for(auto&& x : c0) f(x);
    for(auto&& x : c1) f(x);
}

您可以按如下方式使用forJoined

std::vector<int> a{0, 1, 2};
std::vector<char> b{'a', 'b', 'c'};

forJoined(a, b, [](auto x){ std::cout << x; });
// Will print "012abc".

正如您所看到的,当容器存储不同类型的元素时,forJoined也会起作用。使用模板参数传递f不会带来额外的开销see my latest article on the subject

您可以使用variadic template将此扩展到任意数量的容器。

答案 2 :(得分:0)

您可以使用初始化列表。例如

#include <iostream>
#include <vector>
#include <string>
#include <functional>
#include <initializer_list>
#include <functional>

int main() 
{
    std::vector<std::string> v1 = { "A", "B", "C" };
    std::vector<std::string> v2 = { "X", "Y", "Z" };

    for ( const auto &r : { std::cref( v1 ), std::cref( v2 ) } )
    {
        for ( const auto &s : r.get() ) std::cout << s << ' ';
    }

    std::cout << std::endl;

    return 0;
}

程序输出

A B C X Y Z