Nano Hash - криптовалюты, майнинг, программирование

Как указать размер статического вектора С++, когда размер известен только во время выполнения - не требуется

У меня есть класс, который содержит член, который является вектором с плавающей запятой и должен быть доступен для всех объектов класса. Размер члена не будет известен до времени выполнения, и я не могу понять, как установить размер вектора.

Моя первая попытка состояла в том, чтобы попытаться установить размер в конструкторе, но это просто память все перепутала. numScores – количество создаваемых оценок, известное только во время выполнения.

class Window
{
public:
    Window ();

private:
    vector<float> mScores;
};

vector<float> Window::mScores;

Window::Window ()
{
    mScores.resize (numScores);
}

Я попытался установить размер в разделе инициализации члена конструктора:

class Window
{
public:
    Window ()

private:
    vector<float> mScores;
}

vector<float> Window::mScores;

Window::Window ()
    : mScores (numScores)
{
}

и получил следующую ошибку "'std::vector<float, std::allocator<float> > Window::mScore' is a static data member; it can only be initialized at its definition"

Итак, я переместил настройку размера туда, где определяется mScores:

class Window
{
public:
    Window ()

private:
    vector<float> mScores;
}

vector<float> Window::mScores (numScores);

Window::Window ()
{
}

Это скомпилировалось нормально, но когда я запустил свою программу и посмотрел на Window::mScores, размер был равен 0.

Я пытался отследить эту проблему в течение нескольких недель и, наконец, сегодня понял, в чем проблема, но понятия не имею, как ее исправить. Было бы легко, если бы numScores был известен во время компиляции, но, к сожалению, это не так.

Есть ли какой-нибудь шаблон проектирования или библиотека, похожая на повышение, в которой было бы что-то, на что я мог бы сослаться, чтобы понять это?

Любая помощь будет принята с благодарностью!

Изменить. Спасибо за каждый вклад. Как я упомянул ниже, я совершил ошибку, когда скопировал класс Window с компьютера, на котором фактически находится код, и объединил его, вырезав и вставив класс в другие примеры.

С учетом сказанного получается, что статическое поле мне не нужно. Я занимаюсь переводом FORTRAN (или Fogeytran, как я начал его называть) на C++ и очень запутался в том, как используется поле mScores. Как только я понял, что он не распределяется между объектами Windows, все встало на свои места и теперь работает нормально.

Еще раз, еще раз спасибо за информацию.

10.01.2014

  • mScores не является статическим, поэтому строки инициализации вне класса быть не должно. 11.01.2014
  • Как говорит @chris, вы не объявили это static. Предполагая, что это просто ошибка, и что вы хотите, чтобы он был статичным, что, если вы создали vector<float> в куче и сохранили указатель на него в своем классе. (не забудьте удалить его, когда закончите работу с dtor) Установите указатель на null при инициализации, а затем создайте новый экземпляр, когда будете готовы. Тем не менее, я не уверен, что вам нужен здесь статический вектор... 11.01.2014
  • @crush Если бы это был указатель static на динамически инициализируемую память, и он удалил его в деструкторе, это было бы проблематично, как только у него было бы более одного объекта одновременно. 11.01.2014
  • Согласитесь, boost::optional<std::vector>, вероятно, будет работать лучше, если требуется этот необязательный элемент. Если нет, то есть еще assign. 11.01.2014
  • Все, извините, но поскольку я не могу выйти в интернет с компьютера, на котором установлено мое программное обеспечение, у меня была опечатка, когда я не указал, что mScores является статическим в приватном разделе. К сожалению, я сделал ошибку в первом коде и просто вырезал и вставил в остальные, усугубив ошибку. 24.01.2014

Ответы:


1

Поскольку mScores не является переменной-членом static, не следует пытаться определить ее вне класса. Как только это будет исправлено, оно должно работать так, как вы ожидаете. Смотри ниже:

class Window
{
public:
    Window ()

private:
    vector<float> mScores;
}

// mScores isn't static, so this shouldn't be here
// vector<float> Window::mScores;

Window::Window ()
    : mScores (numScores)
{
}
10.01.2014

2

Из вашего описания кажется, что вы хотите, чтобы этот вектор был статическим элементом данных. Если это так, вы также можете определить статическую функцию-член, которая изменит размер вектора, когда вы узнаете его фактический размер. Например

#include <vector>

class Window
{
public:
    Window() = default;
    static void SetSize( std::vector<float>::size_type n ) { mScores.resize( n ); }

private:
    static std::vector<float> mScores;
};

std::vector<float> Window::mScores;

int main()
{
   Window::SetSize( 10 );
}

Если вы хотите, чтобы эта функция могла изменить размер вектора только после того, как вы можете определить его следующим образом

static void SetSize( std::vector<float>::size_type n ) 
{
    static bool resized;

    if ( !resized ) 
    {
        mScores.resize( n ); 
        resized = true;
    }
}
10.01.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..