2016-08-16 52 views
0

我有m ints和n浮点数,我想在一个循环中迭代它们。为了做到这一点,我能想到的两种可能的方式,但我不知道他们实际上是可行的:C++遍历不同类型的数组

  1. 理想我想给M + N数字存储在一个阵列(例如,在一个性病:: vector),有没有一种方法(一个容器,或通过多态性),我可以做到这一点?

  2. 如果我必须将整数和浮点数存储在两个数组中,那么是否存在(或如何编写)可以在循环中迭代两个数组的迭代器?

欢迎任何想法!

+0

你可以用'any'来存储他们,但你需要有一个标志变量知道从哪里开始阅读整数和从哪里开始阅读花车,只是将它们放置在两个数组会SI mpler。 –

+2

为什么你想在一个循环中迭代它们? –

+1

我想在一个循环中迭代它们,因为它会使我的原始程序更简洁,因为它可以做同样的事情,而不管数据类型如何。 – pumpkinjuice

回答

2

这似乎是一个模板函数可能是一个很好的解决方案:

  1. 它保留了语义“做同样的花车和整数容器的两个容器”,而不产生的人工容器从性能的角度看节省的代码
  2. 几行的缘故彩车/整数会有用手工编码迭代循环两个数组在没有任何区别,如果你让编译器的优化-O3
  3. 它适用于其他类型(例如doubleint64_tint32_t等)

它应该是这样的:

processData(std::vector<float>{1.2, 2.5, 3.5, 4.5}); 
processData(std::vector<int>{1, 2, 3, 4}); 

看到一个working example here

0

可以创建一个结构,并以此作为你的数组:

struct my_compund_type { 
    int integer; 
    float very_narrow_and_possibly_I_meant_double_float; 
}; 

std::vector<my_compund_type> array; 

你的另一个选择是for循环,只有遍历索引,并访问数组都需要做。

+1

这只适用于m == n。特别是如果这两个值在逻辑上不是对(即它们不属于一对),这将是一个非常误导性的解决方案...... –

2

有以下几种:

template<typename T> 
void processData(std::vector<T> data) { 
    for (auto& d : data) { 
    // do some processing 
    } 
} 

你会用它打电话选项,各有其优缺点:

  1. 使用两个std :: vector,一个用于int,另一个用于float,并将它们迭代到单独的循环中。如果循环体是非平凡的,把它放到一个模板化的函数中,所以你不必复制代码。

  2. 使用boost :: any的std :: vector,它可以同时存储浮点数和整数。获取该值时,必须将其“投射”为正确的类型。再次,您可能想将任何逻辑放入模板函数中以避免代码重复。由于boost :: any转换为实际类型涉及类型检查,因此此解决方案没有最佳性能。另一方面,它接近Python等运行时类型语言的行为。

  3. 特别是如果你有更多然后只有两种类型:使用类型(float和int)的boost :: fusion :: map类型的向量。您可以使用boost :: fusion :: foreach来迭代地图,它将调用一个模板化函数并将矢量传递给它。这样你就可以获得第一个解决方案,但这次它对于许多数据类型来说更容易扩展。

由于C++是静态类型,也没有办法有含有浮标和整数无升压单个容器::任何。例外:如果条目数量在编译时是固定的,boost :: mpl :: vector可以帮助你。

编辑:如果你想要的代码示例,给使用更多的信息,你想要去的方式......

1

你可能有不同的因式分解你的代码,例如:

struct MyData { 

    template <typename FUNC> 
    void run(FUNC func) { 
     for (auto& i : ints) { 
       func(i); 
     } 
     for (auto& f : floats) { 
       func(f); 
     } 
    } 

    std::vector<int> ints; 
    std::vector<floats> floats; 
}; 

,然后使用类似于

MyData myData = /**/; 

myData.run([](auto e){ std::cout << e << " "; });