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

Переменная-член типа std::array‹T, ?›

Как объявить и установить переменную-член для класса шаблона AClass, который имеет тип std::array<T, ?> (с неопределенным размером)? Фактический std::array должен быть создан в конструкторе, где размер массива является параметром конструктора.

В коде псевдо-С++:

template <typename T> class AClass {

protected:
    std::array<T, ?>* array;

public:

    AClass(int n) {
        this->array = new std::array<T, n>;
    }

}

Как будет выглядеть правильный код?

18.12.2012

  • Для чего нужен new? 18.12.2012
  • Это совершенно не то, для чего предназначен std::array, и вы не можете передать параметр в такой шаблон. 18.12.2012
  • @R.MartinhoFernandes Скажи мне, почему здесь это неправильно (игнорируя тот факт, что это невозможно, поскольку размер std::array должен быть константой времени компиляции). 18.12.2012
  • @cls: #1 не компилируется, потому что член не является указателем; # 2 происходит утечка ресурсов, потому что он отказывается от гарантированных компилятором вызовов деструктора. 18.12.2012
  • @R.MartinhoFernandes #1 ясно, я изменил это в вопросе. #2: Как правильно создать новый объект-член в конструкторе? 18.12.2012
  • AClass(int n) : array() {} будет работать нормально (игнорируя тот факт, что размер не должен быть доступен во время компиляции) или AClass(int n) : array(n) {} для элемента вектора. В общем случае вы можете использовать T() для создания объекта типа T; new не задействовано, это не Java. 18.12.2012

Ответы:


1

Не используйте для этого std::array, используйте std::vector. Размер std::array должен быть константой времени компиляции. Если вы хотите передать его в конструктор, вам нужно использовать std::vector.

18.12.2012
  • Или std::unique_ptr<T[]> array, если изменение размера и другие vector возможности не требуются. 18.12.2012
  • Хм, я не уверен, есть ли в этом какая-то польза. Синтаксис, безусловно, сложнее, и я сомневаюсь, что он значительно быстрее или более эффективно использует память. 18.12.2012
  • Я не думаю, что это будет быстрее, но у него немного меньше памяти, чем у vector. Как я уже сказал, если изменение размера не требуется, возможно, стоит подумать, в противном случае используйте vector. 18.12.2012
  • @Praetorian, что немного меньше накладных расходов? Во всяком случае, у unique_ptr<T[]> есть подголовник, потому что он не знает своего размера. 18.12.2012
  • @R.MartinhoFernandes Разве я не это сказал? Что unique_ptr<T[]> требует меньше памяти по сравнению с vector? 18.12.2012

  • 2

    Фактический std::array должен быть создан в конструкторе, где размер массива является параметром конструктора.

    Размер std::array должен быть известен во время компиляции, что в вашем случае не так.

    Вам придется использовать std::vector для этого.

    18.12.2012

    3

    Помимо использования std::vector, где размер действительно определяется во время выполнения, вы также можете указать размер во время компиляции (например, до максимально возможного значения в зависимости от вашей проблемы) и «распространить» параметр шаблона клиентам вашего класса, т.е.

    template <typename T, std::size_t n> 
    class AClass {
       protected:
           std::array<T, n> array;
       public:
           AClass() {
               // nothing to do
           }
    }
    

    затем вы используете его следующим образом:

    AClass<int, 5> myAClass;
    
    18.12.2012
  • Да, но есть явное требование, чтобы размер массива был параметром конструктора. Здесь его нет и быть не может. 18.12.2012
  • зависит от истинного требования OP, иногда OP вводит ненужные требования, и действительно, размер известен во время компиляции. 18.12.2012

  • 4

    У вас не может быть std::array с неопределенным размером.
    Вместо этого используйте std::unique_ptr<T[]> или std::vector.

    18.12.2012
    Новые материалы

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

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

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

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

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

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

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