Как получить постоянный размер вектора для объявления массива? - PullRequest
0 голосов
/ 18 апреля 2020

Я читаю данные из текстового файла, который в основном содержит строки и столбцы двойных типов данных. Часть кода показана ниже:

   m_data = vector<vector<double> >(columns, vector<double>(lineCount - 3));
        for (int x = 0; x < lineCount - 3; x++)
        {
            for (int y = 0; y < columns; y++)
            {
                m_data[y][x] = total_Data[it]; //total_Data is the complete data set read from a file 
                it++;                        //which contain all data sets from a simulation and they are 
                                            //separated into vectors here in this code

            }
        }
   size_t len = m_data[1].size();     //m_data[1] vector represents the signal data set
   double signaldata[len];
   copy(m_data[1].begin,m_data[1].end,signaldata);

Так что проблема в том, что когда я копирую данные из вектора в массив, для инициализации требуется постоянная длина массива. Но size () дает длину вектора, которая не является константой. И sizeof (вектор) возвращает размер самого объекта, который составляет 16 байтов. Итак, как я могу преодолеть эту проблему получения постоянного размера из вектора для инициализации массива

1 Ответ

2 голосов
/ 18 апреля 2020

Ответ: вы не можете.

std::vector имеет динамический размер c, то есть его размер может изменяться во время выполнения (т. Е. На l oop от ввода пользователя). В C ++ недопустимо создавать «массив» некомпилируемого постоянного размера. Вы можете однако создать динамически распределенный массив с new (например, auto my_array = new char[vector.size()]). Однако вы на самом деле не должны этого делать, особенно без каких-либо проверок разумности размера вектора.

Альтернативой может быть непосредственное использование std::vector. Если вам нужно работать с более старым (или C) API, который требует указатель на начало вашего «массива» в качестве аргумента, вы можете использовать vector::<T>::data, который будет возвращать &vector[0].

если у меня есть этот код:

void my_old_api_function(char* c) {
...
}

Я могу сделать это:

std::vector<char> my_data;
my_data.emplace_back('c');
...
my_old_api_function(my_data.data()); // Pass a pointer to the first element
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...