Заполнение двумерного статического вектора с использованием стандарта C ++ 98 - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть двумерный статический вектор (std::vector< std::vector<double> >), который необходимо заполнить, и я работаю над старым проектом, который необходимо скомпилировать с использованием C ++ 98. Поэтому я не могу использовать синтаксис std::vector<...> v = { {1,2}, {3,4} };.

Для одномерных векторов назначение массива как double a[] = {1,2};, а затем использование std::vector<double> v(a, a+2) делает свое дело; однако, это не работает для двухмерных векторов.

std::vector< std::vector<double> >
x1_step_lw_2(__x1_step_lw_2,
             __x1_step_lw_2 + ARRAY_SIZE(__x1_step_lw_2));

Я получаю следующую ошибку:

../src/energyConsumption/ue-eennlite-model-param-7IN-30NN.cpp:193:33:   required from here                                                   
/usr/include/c++/4.8/bits/stl_construct.h:83:7: error: invalid conversion from ‘const double*’ to ‘std::vector<double>::size_type {aka long \
unsigned int}’ [-fpermissive]                                                                                                                
       ::new(static_cast<void*>(__p)) _T1(__value); 

(ARRAY_SIZE (x) - макрос, который вычисляет размер массива)

И поскольку эти векторы являются атрибутами класса, не имеет смысла инициировать их в конструкторе.

Я борюсь с этой проблемой в течение некоторого времени, и большинство «решений» предполагает переход на C ++ 11, что не вариант.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Попробуйте это:

#include <iostream>
#include <vector>

/**this generates a vector of T type of initial size N, of course it is upto you whether you want to use N or not, and returns the vector*/
template<class T>
std::vector<T> generateInitVecs(size_t N)
{
    std::vector<T> returnable;

    for(int i = 0; i < N; i++)
        returnable.push_back(0);

    return returnable;
}

int main()
{
    std::vector< std::vector<double> > twoDvector;
    /**Since twoDvector stores double type vectors it will be first populated by double type vectors*/
    for(int i = 0; i < 10; i++){
        twoDvector.push_back(generateInitVecs<double>(10));
    }

    /**populating the vector of vectors*/
    for(int i = 0; i < 10; i++)
        for(int j = 0; j < 10; j++){
            /**can be treated as 2D array*/
            twoDvector[i][j] = 50;
        }

    for(int i = 0; i < 10; i++){
        for(int j = 0; j < 10; j++){
            std::cout << twoDvector[i][j] << " ";
        }
        std::cout << "\n";
    }
}

Будет напечатана матрица 10 x 10 со всеми значениями 50.

0 голосов
/ 05 сентября 2018

Мой C ++ 98 ржавый, но что-то вроде этого должно работать:

double a[] = { 1, 2 };
double b[] = { 3, 4 };
double c[] = { 5, 6 };

std::vector<double> v[] =
{
    std::vector<double>(a, a + ARRAY_SIZE(a)),
    std::vector<double>(b, b + ARRAY_SIZE(b)),
    std::vector<double>(c, c + ARRAY_SIZE(c))
};

std::vector< std::vector<double> > vv(v, v + ARRAY_SIZE(v));
...