default initialization для std::vector

81
09 ноября 2021, 10:20

Можно ли как-то проинициализировать n элементов std::vector<int> по-умолчанию, т.е. чтобы он содержал n неинициализированных значений, а не n нулей? Рассматриваются любые легальные варианты (замена аллокатора? доступ к внутренней памяти?).

Answer 1

Можно заменить int на структуру с соответствующим конструктором, не инициализирующим значение. Например:

struct t_int
{
    int value;
    t_int() {} // Uninitilaized 'value' !
    t_int(int i) : value(i) {}
    t_int(const t_int& i) =default;
    t_int(t_int&& i) =default;
    operator int() const { return value; }
};
// test:
int main()
{
    { std::vector< t_int > test = { 1,2,3,4 }; }
    std::vector< t_int > test(4);
    cout << test[0]<<test[1]<<test[2]<<test[3] << endl;
    return 0;
}
Answer 2

Вам нужен reserve. Вы не хотите инициализировать элементы, Вы хотите выделить память под них.

В противном случае не понятно, что именно Вы хотите. Вы пишите:

Можно ли как-то проинициализировать n элементов std::vector по-умолчанию, т.е. чтобы он содержал n неинициализированных значений, а не n нулей?

Т.е. Вы хотите проинициализировать n элементов, но так, чтобы они остались неинициализированными :)

Upd.: на данный момент я пришел к выводу, что использование custom-аллокатора в данном случае не поможет:

  1. Используем тип аллокатор как параметр шаблона класса std::vector - очевидно, что это никак не поможет, потому что конструктор по-умолчанию __vector_base никак не использует аллокатор, соответственно, мы не сможем переопределить поведение при вызове конструктора (по-умолчанию) класса std::vector.
  2. Используем конструктор, который принимает аллокатор в качестве аргумента - будет вызван следующий конструктор класса __vector_base:
template <class _Tp, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a)
    : __begin_(nullptr),
      __end_(nullptr),
      __end_cap_(nullptr, __a)
{
}

Как видите, аллокатор используется только в одном месте - в конструкторе __end_cap. __end_cap это объект класса __compressed_pair, который, очевидно, не может содержать какие-либо вызовы для аллоцирования памяти в своем конструкторе.

Таким образом, если у нас нет таких "точек", в которых мы бы могли повлиять на аллокацию памяти для вектора при вызове конструктора по-умолчанию (или с одним параметром - аллокатором), нет и смысла использовать custom-аллокатор для Вашей проблемы.

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

Answer 3

Взгляните на данную реализацию из библиотеки folly. Из названия следует, что это очень implementation-defined код в красивой обёртке (не без UB). Вас интересует folly::resizeWithoutInitialization.

READ ALSO
Работа с файлами (считывание и запись)

Работа с файлами (считывание и запись)

Надо при помощи генератора случайных чисел сформировать 10 чисел в файлеНайти сумму максимального и минималного числа в файле

104
Использование javascript вместо typescript в angular

Использование javascript вместо typescript в angular

Есть ли возможность запускать js код в файлеts? Ибо когда копирую свой js код и вставляю в файл

248
Ошибка JS &quot;Uncaught TypeError: Cannot read property &#39;classList&#39; of null &quot;

Ошибка JS "Uncaught TypeError: Cannot read property 'classList' of null "

Помогите пожалуйста! Пишу тетрис на JS и все время выдает ошибку! Я новичок, поэтому не пинайте за мой код

105
Не получается использовать картинки в React

Не получается использовать картинки в React

Перерыл много страниц с тем, где пишут, как использовать картинки из папки с проектом, делаю так, к примеру:

82