Подтвердить что ты не робот

С++ 11 std:: array

Я хотел бы использовать std::array из С++ 11 в качестве поля моего собственного класса. Он принимает два параметра шаблона (сначала определяет тип данных, второй определяет размер массива).

Но я знаю второй параметр только в конструкторе. Я не знаком со стандартом С++ 11, но я полагаю, что невозможно установить параметр шаблона во время выполнения.

Есть ли альтернативы для std::array? std::vector, вероятно, слишком много, потому что я никогда не изменю его размер.

4b9b3361

Ответ 1

std::vector - самая простая вещь для использования; хотя, как вы говорите, он отбрасывает несколько байтов, если вам не придется изменять его размер.

std::unique_ptr<T[]>, инициализированный с использованием результата new T[size], был бы наиболее эффективным; он должен быть того же размера, что и указатель, и удалит выделенную память для вас, когда она будет уничтожена. Тем не менее, он не копируется; вам нужно будет предоставить конструктор копирования для своего класса, если вы хотите, чтобы он был скопирован. Он также менее удобен, чем std::array и std::vector, так как он не имеет интерфейса стандартного контейнера. Возможно, вы могли бы написать обертку в стиле STL, если вам это нужно; но я бы просто использовал std::vector в этом случае.

Ответ 2

Я не знаком с стандартом С++ 11, но я полагаю, что невозможно установить параметр шаблона во время выполнения.

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

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

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

Ответ 3

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

class Container
{
    vector<T> v;
    Container(int i) : v(i) { v.shrink_to_fit(); }
};

Если вас беспокоит пространство:

http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit

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

BTW Вы также можете построить вектор с вектором (size_t N, T t), который будет устанавливать каждый начальный элемент в t (без этого элементы по умолчанию построены).

Ответ 4

Если вы не знаете размер массива до времени выполнения, вы хотите использовать std::vector.