#c #c 11 #assign #g 4.8 #stdarray
#c #c 11 #назначить #g 4.8 #stdarray
Вопрос:
В следующем коде компилятор жалуется следующим образом: struct std::array<double,5ul> has no member named 'assign'
. Здесь это кажется возможным. Почему это так? (Компилятор: g 4.8.2)
#include <array>
int main()
{
std::array<double,5> arr;
arr.assign(4.); // error: has no member named 'assign'
return 0;
}
Комментарии:
1. Вы спрашиваете, почему шаблон класса
std::array
не имеетassign
функции-члена?
Ответ №1:
array::assign()
является расширением Visual Studio. Вы компилируете с помощью g . Проверьте здесь стандартный массив g
Комментарии:
1. s / стандартный g / стандартный C /
2. Почему, почему? зачем нужно это расширение? .. 1 КСТАТИ
3. @Nawaz Это помогает остановить сообщение об ошибке «не имеет элемента с именем ‘assign'».
Ответ №2:
Как уже упоминалось, просто нет assign
элемента std::array
.
Теперь возникает интересный вопрос: почему? В конце концов, у других контейнеров есть assign
метод-член !
Я хотел бы отметить, что, в отличие от других контейнеров, std::array
имеет фиксированный размер. Если вы используете std::vector<T>::assign
(что было бы близким эквивалентом), размер вектора изменяется соответствующим образом, чтобы соответствовать размеру назначаемой последовательности; однако с массивом это было бы невозможно:
- что бы вы сделали, если назначаемая последовательность короче массива?
- что бы вы сделали, если назначаемая последовательность длиннее массива?
это было бы нелогично, поскольку вопрос не возникает для других контейнеров, поскольку их размер просто адаптируется на лету.
По аналогичной причине std::array
не имеет: reserve
, capacity
, clear
, insert
, emplace
, erase
, push
/ pop
(и варианты) или resize
. Все они предполагают контейнер, размер которого может меняться.
Комментарии:
1. 1 Хороший ответ. Фактически, вы отвечаете на вопрос, который, как я думал , мог задать OP.
2. @juanchopanza Я должен сказать, что это одно расширение VS, которое выглядит довольно удобным. Я не знал, что он существует, но, глядя на него сейчас, все, что он делает, это вызывает
fill_n
, чтобы установить все элементы для входного аргумента.3. @Praetorian Но есть и
std::array::fill
для этого.4. @juanchopanza Ха-ха, ладно, неважно, тогда вернемся к глупому расширению 🙂
Ответ №3:
Это очень просто, как вы можете видеть здесь, для массива std нет функции-члена assign. Однако существует вызываемая функция-член fill
, которую вы должны иметь возможность использовать.
Ответ №4:
assign
Метод, членом которого он не является std::array
. Элемент fill
делает то, что assign
сделал в TR1.
assign
первоначально был частью std::tr1::array
(из TR1) и был изменен fill
примерно на проект C 0x (теперь C 11) n2798 (2008).
На самом деле это не расширение Microsoft, я бы предположил, что они, вероятно, сохранили этот метод для совместимости и поддержки tr1
реализаций в производстве (реализации метода точно такие же).