是否有可能在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++) { //... }
或者,明确地限制f
和i
使用额外括号的范围:
{ 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循环体内,您可以轻松地将对象别名化,但仍然需要使用.first
或std::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循环中。