c ++数组问题

时间:2010-07-14 06:09:34

标签: c++ c visual-c++

我想初始化一个大小为200的double数组,其值从0到199,从索引0到c ++中的199。 我知道我可以通过一个简单的For循环来实现它,但有没有办法像这样初始化双数组呢?

由于

8 个答案:

答案 0 :(得分:10)

不是真的。 for循环是您的最佳选择:

double array[200];
for(int i = 0; i < 200; i++)
    array[i] = static_cast<double>(i);

答案 1 :(得分:7)

这是std::generate的一种方式:

template <typename T>
class nexter
{
public:
    nexter(T start = T())
        : value_(start)
    {
    }

    T operator()()
    {
        return value_++;
    }

private:
    T value_;
};

int main()
{
    double data[200];
    std::generate(data, data + 200, nexter<double>());
}

如果您使用的是C ++ 0x,则可以跳过仿函数:

int main()
{
    double data[200];
    double next = 0.0;
    std::generate(data, data + 200, [&next]() { return next++; } );
}

答案 2 :(得分:7)

使用counting_iterator

const int SIZE = 200;
double array[SIZE];
std::copy(counting_iterator<int>(0), counting_iterator<int>(SIZE), array);

答案 3 :(得分:2)

anthony-arnold相同,但使用C ++向量(或列表或双端队列):

std::vector<double> array ;
array.reserve(200) ; // only for vectors, if you want
                     // to avoid reallocations

for(int i = 0; i < 200; i++)
    array.push_back(i) ;

答案 4 :(得分:1)

如果数组的所有值都相同,则可以轻松完成。但是价值观彼此不同,所以我不认为你直接这样做。

double array[200];

for(int i=0 ; i<200 ; i++) { 
    array[i] = (double)i; 
}

答案 5 :(得分:0)

初始化数组值的唯一方法是声明(如果初始化器小于数组,则所有其他元素初始化为零;

double arr[5] = {0, 1, 2}; // arr = [0.0 ,1.0 ,2.0 ,0.0 ,0.0]

否则无法初始化值,您必须遍历数组。

所以你可以做的是:

double arr[] = {0, 1, 2, 3, /* ... */, 199}; 

虽然在大多数情况下循环会更好

答案 6 :(得分:0)

如果200是固定常量并且您不想要运行时开销,我基本上会看到两种解决方案。

对于C解决方案,您可以通过预处理器解决它。在思考Boost有这样的事情的预处理器for循环。这将有利于在编译时完成,根本没有运行时开销。

对于所有编译器/预处理器来说,常量200本身可能有点大,但是大多数现代的应该能够处理这个。

对于C ++解决方案,我认为你可以使用template元编程来实现。具有template参数中元素数量的递归类型可以解决问题。但对于常数而言,编译时间开销很大的常量可能会过高。

答案 7 :(得分:0)

我认为for循环是最简单,最合适的解决方案。如果您只想知道另一种方法,可以使用std::transform

#include <vector>
#include <algorithm>

double op_increase (double i) { return static_cast<double>(static_cast<int>(i)+1); }

int main() 
{ 
    std::vector<double> x( 200 ); // all elements were initialized to 0.0 here
    std::transform( x.begin(), x.end()-1, x.begin()+1, op_increase );

    return 0; 
}