уменьшите способность stl вектора

Нет, селектор «предыдущего сиблинга» отсутствует.

В соответствующей заметке ~ используется для общего брака-последователя (это означает, что элемент появляется после этого, но не обязательно сразу после) и является селектором CSS3. + для следующего родного брата и является CSS2.1.

См. Комбинированный смежный блок-класс из Селектора уровня 3 и 5.7 Смежные селекторные ролики из Каскадные таблицы стилей Уровень 2 Редакция 1 (CSS 2.1) Спецификация .

26
задан Martin Beckett 10 July 2009 в 18:37
поделиться

9 ответов

std::vector<T>(v).swap(v);

Замена содержимого другим вектором меняет местами емкость.

  std::vector<T>(v).swap(v); ==> is equivalent to 

 std::vector<T> tmp(v);    // copy elements into a temporary vector
         v.swap(tmp);              // swap internal vector data

Swap () изменяет только внутреннюю структуру данных.

39
ответ дан 28 November 2019 в 06:05
поделиться

Я не эксперт в C++, но это кажется этот работы решения (по крайней мере компилирующий, это с g ++ делает):

std::vector<int>some_vector(20);//initial capacity 10
//first you gotta resize the vector;
some_vector.resize(10);
//then you can shrink to fit;
some_vector.shrink_to_fit();
//new capacity is 10;
0
ответ дан 28 November 2019 в 06:05
поделиться

В C ++ 11 можно вызвать функцию-член shrink_to_fit () . В разделе 23.2.6.2 проекта стандарта говорится:

shrink_to_fit - это необязательный запрос. для уменьшения емкости () до размера () . [Примечание: запрос не является обязательным для позволить широту для оптимизация для конкретной реализации. —В конце примечания]

35
ответ дан 28 November 2019 в 06:05
поделиться

Идиоматическое решение состоит в том, чтобы поменять местами только что построенный вектор.

vector<int>().swap(v);

Редактировать: Я неправильно прочитал вопрос. Приведенный выше код очистит вектор. OP хочет сохранить элементы нетронутыми, только сжать capacity () до size () .

Трудно сказать, сможет ли код aJ это сделать. Сомневаюсь, что есть портативное решение. Для gcc вам нужно будет взглянуть на их конкретную реализацию vector .

edit : Итак, я взглянул на реализацию libstdc ++. Кажется, что решение aJ действительно сработает.

vector<int>(v).swap(v);

См. источник , строка 232.

6
ответ дан 28 November 2019 в 06:05
поделиться

Посмотрите на Скотт Мейерс, эффективный элемент STL 17.

По сути, вы не можете напрямую уменьшить размер хранилища std :: vector . resize () и Reseve () никогда не уменьшат фактический объем памяти, занимаемый контейнером. «Уловка» состоит в том, чтобы создать новый контейнер нужного размера, скопировать данные и поменять их местами с текущим контейнером. Если мы хотим очистить контейнер, это просто:

std::vector<T>().swap(v);

Если нам нужно скопировать данные, нам нужно сделать копию:

std::vector<T>(v).swap(v);

Это создает новый вектор с данными из старого. , делая копию, которая потребуется для любой операции, которая имеет нужный вам эффект. Затем вызов swap () просто поменяет местами внутренние буферы между объектами.

14
ответ дан 28 November 2019 в 06:05
поделиться

Нет, вы не можете уменьшить емкость вектора без копирования. Однако вы можете контролировать, насколько увеличится новое выделение, проверяя capacity () и вызывая reserve () каждый раз, когда вы что-то вставляете. Поведение по умолчанию для std :: vector - увеличивать его емкость в 2 раза каждый раз, когда требуется новая емкость. Вы можете увеличить его с помощью своего собственного магического соотношения:

template <typename T>
void myPushBack(std::vector<T>& vec, const T& val) {
    if (vac.size() + 1 == vac.capacity()) {
        vac.reserve(vac.size() * my_magic_ratio);
    }

    vec.push_back(val);
}

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

3
ответ дан 28 November 2019 в 06:05
поделиться

Я не говорю, что GCC не может иметь какой-то метод для выполнения того, что вы хотите, без копии, но это было бы сложно реализовать (я думаю), потому что векторы должны использовать Объект Allocator для выделения и освобождения памяти, а интерфейс для Allocator не включает метод reallocate () . Не думаю, что это невозможно сделать, но это может быть сложно.

2
ответ дан 28 November 2019 в 06:05
поделиться

Если вы ' Если вы беспокоитесь о накладных расходах вашего вектора, то, возможно, вам стоит подумать об использовании другого типа структуры данных. Вы упомянули, что как только ваш код завершит инициализацию вектора, он станет процессом только для чтения. Я бы предложил использовать открытый массив, который позволит программе определять свою емкость во время компиляции. Или, возможно, вам больше подойдет связанный список.
Дай мне знать, не понял ли я, что ты к чему.

-UBcse

1
ответ дан 28 November 2019 в 06:05
поделиться

Получите книгу Скотта Майерса «Эффективный STL». В нем есть полный пункт об уменьшении пропускной способности вектора.

0
ответ дан 28 November 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: