Нет, селектор «предыдущего сиблинга» отсутствует.
В соответствующей заметке ~
используется для общего брака-последователя (это означает, что элемент появляется после этого, но не обязательно сразу после) и является селектором CSS3. +
для следующего родного брата и является CSS2.1.
См. Комбинированный смежный блок-класс из Селектора уровня 3 и 5.7 Смежные селекторные ролики из Каскадные таблицы стилей Уровень 2 Редакция 1 (CSS 2.1) Спецификация .
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 () изменяет только внутреннюю структуру данных.
Я не эксперт в 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;
В C ++ 11 можно вызвать функцию-член shrink_to_fit ()
. В разделе 23.2.6.2 проекта стандарта говорится:
shrink_to_fit
- это необязательный запрос. для уменьшения емкости()
до размера()
. [Примечание: запрос не является обязательным для позволить широту для оптимизация для конкретной реализации. —В конце примечания]
Идиоматическое решение состоит в том, чтобы поменять местами только что построенный вектор.
vector<int>().swap(v);
Редактировать: Я неправильно прочитал вопрос. Приведенный выше код очистит вектор. OP хочет сохранить элементы нетронутыми, только сжать capacity ()
до size ()
.
Трудно сказать, сможет ли код aJ это сделать. Сомневаюсь, что есть портативное решение. Для gcc
вам нужно будет взглянуть на их конкретную реализацию vector
.
edit : Итак, я взглянул на реализацию libstdc ++. Кажется, что решение aJ действительно сработает.
vector<int>(v).swap(v);
См. источник , строка 232.
Посмотрите на Скотт Мейерс, эффективный элемент STL 17.
По сути, вы не можете напрямую уменьшить размер хранилища std :: vector
. resize ()
и Reseve ()
никогда не уменьшат фактический объем памяти, занимаемый контейнером. «Уловка» состоит в том, чтобы создать новый контейнер нужного размера, скопировать данные и поменять их местами с текущим контейнером. Если мы хотим очистить контейнер, это просто:
std::vector<T>().swap(v);
Если нам нужно скопировать данные, нам нужно сделать копию:
std::vector<T>(v).swap(v);
Это создает новый вектор с данными из старого. , делая копию, которая потребуется для любой операции, которая имеет нужный вам эффект. Затем вызов swap ()
просто поменяет местами внутренние буферы между объектами.
Нет, вы не можете уменьшить емкость вектора без копирования. Однако вы можете контролировать, насколько увеличится новое выделение, проверяя 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);
}
Если вы любите немного хитрые приемы, вы всегда можете передать свой собственный распределитель и сделать все, что вам нужно, чтобы вернуть неиспользованную емкость.
Я не говорю, что GCC не может иметь какой-то метод для выполнения того, что вы хотите, без копии, но это было бы сложно реализовать (я думаю), потому что векторы должны использовать Объект Allocator
для выделения и освобождения памяти, а интерфейс для Allocator
не включает метод reallocate ()
. Не думаю, что это невозможно сделать, но это может быть сложно.
Если вы ' Если вы беспокоитесь о накладных расходах вашего вектора, то, возможно, вам стоит подумать об использовании другого типа структуры данных. Вы упомянули, что как только ваш код завершит инициализацию вектора, он станет процессом только для чтения. Я бы предложил использовать открытый массив, который позволит программе определять свою емкость во время компиляции. Или, возможно, вам больше подойдет связанный список.
Дай мне знать, не понял ли я, что ты к чему.
-UBcse
Получите книгу Скотта Майерса «Эффективный STL». В нем есть полный пункт об уменьшении пропускной способности вектора.