具有以下类似的代码:
#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
}
}
我想一次性遍历来自v1
和v2
的所有元素(因为逻辑在这些循环中很难,我不能在其中使用函数 - 为此问题)。
所以理想的解决方案就是:
for (const auto& s : magic(v1,v2)) {
// do something with s
}
显然没有分配新容器并且复制了所有元素(因为这个解决方案很简单。
是否有类似的东西,例如在boost
?
答案 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;
}
答案 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