Восстановить память для внутреннего вектора в std :: vector <std :: vector <TYPE>> - PullRequest
0 голосов
/ 14 мая 2018

Я хотел бы зарезервировать память для внутреннего вектора в std::vector<std::vector<TYPE>>, чтобы избежать большого количества отдельных выделений памяти во время последующего push_back. Я не знаю точно innerSize вектора, но могу дать хорошую оценку.

std::resize можно использовать как

vecs.resize(outerSize, std::vector<TYPE>(innerSize));

, где outerSize и innerSize - целые числа. Это не работает для меня, потому что конструктор по умолчанию не применяется. Однако std::reserve не предоставляет такой интерфейс.

Это хороший способ зарезервировать память для всех внутренних векторов?

vecs.resize(outerSize);
for (auto &elem : vecs) {
    elem.reserve(innerSize);
}

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

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

struct TableRow {
    std::vector<TYPE> data;
    TableRow() {
        data.reserve(SIZE);
    }
}

std::vector<TableRow> myVectorOfVectors;

Другая выгода от этого заключается в том, что ваш внутренний вектор получает имя, которое вы можете понять (например, TableRow); но недостатком является то, что если вы не готовы играть в игру наследования std::vector (если сомневаетесь, не делайте этого); использование вами класса-обертки должно быть немного неловким, поскольку вам нужно добавить .data или что-то в этом роде.

Как уже говорили другие; твой путь в порядке.

0 голосов
/ 14 мая 2018

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

#include <vector>

std::vector<std::vector<NonDefaultConstructible>> vecs;
vecs.resize(outerSize);
for (auto &elem : vecs) {
    elem.reserve(innerSize);
}

Единственный способ улучшить его - это конструктор для std::vector, который бы принимал емкость и создавал вектор с нулевым размером и предоставленной емкостью. Такого конструктора не существует .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...