是否有可能在for循环中声明两个不同types的variables?

有可能在C ++的for循环的初始化主体中声明不同types的两个variables?

例如:

for(int i=0,j=0 ... 

定义了两个整数。 我可以在初始化主体中定义一个int和一个char ? 这将如何完成?

不可能,但你可以这样做:

 float f; int i; for (i = 0,f = 0.0; i < 5; i++) { //... } 

或者,明确地限制fi使用额外括号的范围:

 { float f; int i; for (i = 0,f = 0.0; i < 5; i++) { //... } } 

没有 – 但技术上有一个解决办法(不是我实际上使用它,除非被迫):

 for(struct { int a; char b; } s = { 0, 'a' } ; sa < 5 ; ++sa) { std::cout << sa << " " << sb << std::endl; } 

对于C ++ 17,您应该使用结构化的绑定声明 。 语法在gcc-7和clang-4.0( 铿锵的实例 )中被支持。 这允许我们像这样解开一个元组:

 for (auto [i, f] = std::tuple{1, 1.0}; i < N; ++i) { /* ... */ } 

对于C ++ 14,您可以像C ++ 11(下面)一样添加基于types的std::get 。 因此,在下面的例子中,而不是std::get<0>(t) ,你可以有std::get<int>(t)


对于C ++ 11 std::make_pair允许你为两个以上的对象,以及std::make_tuple

 for (auto p = std::make_pair(5, std::string("Hello World")); p.first < 10; ++p.first) { std::cout << p.second << std::endl; } 

std::make_pair将返回std::pair的两个参数。 元素可以用.second.second来访问。

对于两个以上的对象,你需要使用一个std::tuple

 for (auto t = std::make_tuple(0, std::string("Hello world"), std::vector<int>{}); std::get<0>(t) < 10; ++std::get<0>(t)) { std::cout << std::get<1>(t) << std::endl; // cout Hello world std::get<2>(t).push_back(std::get<0>(t)); // add counter value to the vector } 

std::make_tuple是一个可变参数模板,它将构造任意数量参数的元组(当然有一些技术限制)。 这些元素可以通过std::get<INDEX>(tuple_object)

在for循环体内,您可以轻松地将对象别名化,但仍然需要使用.firststd::get作为for循环条件并更新expression式

 for (auto t = std::make_tuple(0, std::string("Hello world"), std::vector<int>{}); std::get<0>(t) < 10; ++std::get<0>(t)) { auto& i = std::get<0>(t); auto& s = std::get<1>(t); auto& v = std::get<2>(t); std::cout << s << std::endl; // cout Hello world v.push_back(i); // add counter value to the vector } 

对于C ++ 98和C ++ 03您可以明确指定std::pair的types。 虽然没有标准的方法将其推广到两种以上的types:

 for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) { std::cout << p.second << std::endl; } 

您不能在初始化中声明多种types,但可以将其分配给多种types的EG

 { int i; char x; for(i = 0, x = 'p'; ...){ ... } } 

只要在自己的范围内声明它们。

有关嵌套多个for循环的另一种方法,请参阅“ 是否有办法在for循环中定义两种types的variables? 另一种方式优于Georg的“结构技巧”的好处是它(1)允许混合使用静态局部variables和非静态局部variables,以及(2)允许您拥有不可复制的variables。 缺点是它的可读性差得多,可能效率不高。

定义一个macros:

 #define FOR( typeX,x,valueX, typeY,y,valueY, condition, increments) typeX x; typeY y; for(x=valueX,y=valueY;condition;increments) FOR(int,i,0, int,f,0.0, i < 5, i++) { //... } 

只要记住,你的variables作用域也不会在这个for循环中。