是否有可能宣布不同类型的两个变量在for循环?是否有可能宣布不同类型的两个变量在for循环?(Is

2019-05-10 10:04发布

是否有可能在一个初始化体申报两种不同类型的变量在C ++中循环?

例如:

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

定义了两个整数。 我可以定义一个intchar在初始化的身体吗? 这将如何做呢?

Answer 1:

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

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++)
    {
       //...
    }
}


Answer 2:

否 - 但在技术上有一个变通(不,其实我使用它,除非被迫):

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


Answer 3:

C ++ 17: 是的! 你应该用一个结构化的绑定声明 。 的语法在GCC-7和铛-4.0(支持铛活例子 )。 这使我们能够解开一个元组,如下所示:

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

上述会给你:

  • int i设定为1
  • double f设定为1.0
  • std::string s设置为"abc"

确保#include <tuple>这类声明。

您可以指定内部的确切类型的tuple通过键入他们全力以赴,因为我有同std::string ,如果你想命名的类型。 例如:

auto [vec, i32] = std::tuple{std::vector<int>{3, 4, 5}, std::int32_t{12}}

C ++ 14:你可以做一样的C ++ 11(下图),增加了基于类型的的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 。 该元素可以与被访问.first.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循环条件和更新表达式

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 。 还有就是要概括这两种类型以上,虽然没有标准的方法:

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


Answer 4:

你不能在初始化声明多个类型,但你可以分配到多种类型的EG

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

刚刚宣布他们在自己的范围内。



Answer 5:

请参阅“ 有没有办法在定义两种类型的变量for循环? ”除了包括用于循环嵌套多个另一种方式。 超过乔格的“结构绝招”的其他方式的优点是,它(1)可以让你有静态和非静态局部变量的混合物,(2),它可以让你有不可复制的变量。 的缺点是,它远小于可读且可效率较低。



Answer 6:

定义一个宏:

#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++)
{
  //...
}

请记住,您的变量的作用域不会是for循环这样不管是哪种。



文章来源: Is it possible to declare two variables of different types in a for loop?