我想初始化一个大小为200的double数组,其值从0到199,从索引0到c ++中的199。 我知道我可以通过一个简单的For循环来实现它,但有没有办法像这样初始化双数组呢?
由于
答案 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)
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;
}