вопрос о массиве c ++ - PullRequest
       10

вопрос о массиве c ++

3 голосов
/ 14 июля 2010

Я хочу инициализировать двойной массив размером 200, и его значение составляет от 0 до 199 от индекса 0 до 199 в c ++.я знаю, что могу сделать это с помощью простого цикла For, но есть ли способ просто инициализировать двойной массив, как этот?

Ответы [ 8 ]

10 голосов
/ 14 июля 2010

Не совсем.Цикл for - ваш лучший вариант:

double array[200];
for(int i = 0; i < 200; i++)
    array[i] = static_cast<double>(i);
7 голосов
/ 14 июля 2010

Использование counting_iterator:

const int SIZE = 200;
double array[SIZE];
std::copy(counting_iterator<int>(0), counting_iterator<int>(SIZE), array);
7 голосов
/ 14 июля 2010

Вот способ с 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 голосов
/ 14 июля 2010

То же, что и Энтони-Арнольд , но с векторами C ++ (или списками, или deque):

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) ;
1 голос
/ 14 июля 2010

Если все значения массива одинаковы, вы можете сделать это легко. Но значения отличаются друг от друга, поэтому я не думаю, что вы делаете это напрямую.

double array[200];

for(int i=0 ; i<200 ; i++) { 
    array[i] = (double)i; 
}
0 голосов
/ 14 июля 2010

Я думаю, что for-loop - самое простое и подходящее решение для вашего случая. Если вы хотите просто узнать еще один способ сделать это, вы можете использовать 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; 
} 
0 голосов
/ 14 июля 2010

Если 200 является фиксированной константой и вам не нужны накладные расходы времени выполнения, я вижу в основном два решения.

Для решения на C вы можете решить его через препроцессор. В думаю, Boost имеет препроцессор for циклов для такой вещи. Это будет иметь преимущество, которое будет сделано во время компиляции, без дополнительных затрат времени выполнения.

Константа 200 сама по себе может быть немного большой для всех компиляторов / препроцессоров, но большинство современных должно справиться с этим.

Для решения C ++ вы могли бы сделать это с помощью template метапрограммирования, я думаю. Рекурсивный тип с количеством элементов в параметре template может помочь. Но для таких больших констант издержки времени компиляции могут быть непомерно высокими.

0 голосов
/ 14 июля 2010

Единственный способ инициализировать значения массивов - это точка объявления (если инициализатор меньше массива, все остальные элементы инициализируются нулем;

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

В противном случае нет способа инициализироватьзначений, и вам придется циклически перебирать массив.

Итак, что вы можете сделать:

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

Хотя в большинстве случаев зацикливание будет намного лучше .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...