Как обнулить вектор c
Для добавления элементов в вектор применяется функция push_back() , в которую передается добавляемый элемент:
#include #include int main() < std::vectornumbers; // пустой вектор numbers.push_back(5); numbers.push_back(3); numbers.push_back(10); for(int n : numbers) cout << n << "\t"; // 5 3 10 std::cout
Векторы являются динамическими структурами в отличие от массивов, где мы скованы его заданым размером. Поэтому мы можем динамически добавлять в вектор новые данные.
Функция emplace_back() выполняет аналогичную задачу — добавляет элемент в конец контейнера:
std::vector numbers< 1, 2, 3, 4, 5 >; numbers.emplace_back(8); // numbers = < 1, 2, 3, 4, 5, 8 >;
Добавление элементов на определенную позицию
Ряд функций позволяет добавлять элементы на определенную позицию.
- emplace(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos
- insert(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos, аналогично функции emplace
- insert(pos, n, value) : вставляет n элементов value начиная с позиции, на которую указывает итератор pos
- insert(pos, begin, end) : вставляет начиная с позиции, на которую указывает итератор pos, элементы из другого контейнера из диапазона между итераторами begin и end
- insert(pos, values) : вставляет список значений начиная с позиции, на которую указывает итератор pos
std::vector numbers< 1, 2, 3, 4, 5 >; auto iter = numbers.cbegin(); // константный итератор указывает на первый элемент numbers.emplace(iter + 2, 8); // добавляем после второго элемента numbers = < 1, 2, 8, 3, 4, 5>;
std::vector numbers1< 1, 2, 3, 4, 5 >; auto iter1 = numbers1.cbegin(); // константный итератор указывает на первый элемент numbers1.insert(iter1 + 2, 8); // добавляем после второго элемента //numbers1 = < 1, 2, 8, 3, 4, 5>; std::vector numbers2 < 1, 2, 3, 4, 5 >; auto iter2 = numbers2.cbegin(); // константный итератор указывает на первый элемент numbers2.insert(iter2 + 1, 3, 4); // добавляем после первого элемента три четверки //numbers2 = < 1, 4, 4, 4, 2, 3, 4, 5>; std::vector values < 10, 20, 30, 40, 50 >; std::vector numbers3 < 1, 2, 3, 4, 5 >; auto iter3 = numbers3.cbegin(); // константный итератор указывает на первый элемент // добавляем после первого элемента три первых элемента из вектора values numbers3.insert(iter3 + 1, values.begin(), values.begin() + 3); //numbers3 = < 1, 10, 20, 30, 2, 3, 4, 5>; std::vector numbers4 < 1, 2, 3, 4, 5 >; auto iter4 = numbers4.cend(); // константный итератор указывает на позицию за последним элементом // добавляем в конец вектора numbers4 элементы из списка < 21, 22, 23 >numbers4.insert(iter4, < 21, 22, 23 >); //numbers4 = < 1, 2, 3, 4, 5, 21, 22, 23>;
Удаление элементов
Если необходимо удалить все элементы вектора, то можно использовать функцию clear :
std::vector v < 1,2,3,4 >; v.clear();
Функция pop_back() удаляет последний элемент вектора:
std::vector v < 1,2,3,4 >; v.pop_back(); // v =
Если нужно удалить элемент из середины или начала контейнера, применяется функция std::erase() , которая имеет следующие формы:
- erase(p) : удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент
- erase(begin, end) : удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент
std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; auto iter = numbers1.cbegin(); // указатель на первый элемент numbers1.erase(iter + 2); // удаляем третий элемент // numbers1 = < 1, 2, 4, 5, 6 >std::vector numbers2 = < 1, 2, 3, 4, 5, 6 >; auto begin = numbers2.cbegin(); // указатель на первый элемент auto end = numbers2.cend(); // указатель на последний элемент numbers2.erase(begin + 2, end — 1); // удаляем с третьего элемента до последнего // numbers2 =
Также начиная со стандарта С++20 в язык была добавлена функция std::erase() . Она не является частью типа vector. В качестве первого параметра она принимает вектор, а в качестве второго — элемент, который надо удалить:
std::vector numbers3 < 1, 2, 3, 1, 5, 6 >; std::erase(numbers3, 1); // numbers3 =
В данном случае удаляем из вектора numbers3 все вхождения числа 1.
Размер вектора
С помощью функции size() можно узнать размер вектора, а с помощью функции empty() проверить, путой ли вектор:
#include #include int main() < std::vectornumbers; if(numbers.empty()) std::cout
С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:
- resize(n) : оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов. Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
- resize(n, value) : также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются недостающие элементы со значением value
std::vector numbers1 < 1, 2, 3, 4, 5, 6 >; numbers1.resize(4); // оставляем первые четыре элемента — numbers1 = numbers1.resize(6, 8); // numbers1 =
Важно учитывать, что применение функции resize может сделать некорректными все итераторы, указатели и ссылки на элементы.
Изменение элементов вектора
Функция assign() позволяет заменить все элементы вектора определенным набором:
std::vector langs = < "Java", "JavaScript", "C">; langs.assign(4, «C++»); // langs =
В данном случае элементы вектора заменяются набором из четырех строк «C++».
Также можно передать непосредственно набор значений, который заменит значения вектора:
std::vector langs< "Java", "JavaScript", "C">; langs.assign(< "C++", "C#", "C">); // langs =
Еще одна функция — swap() обменивает значения двух контейнеров:
std::vector clangs < "C++", "C#", "Java" >; std::vector ilangs < "JavaScript", "Python", "PHP">; clangs.swap(ilangs); // clangs = < "JavaScript", "Python", "PHP">; for(std::string lang : clangs)
Сравнение векторов
Векторы можно сравнивать — они поддерживают все операции сравнения: , =, ==, !=. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:
std::vector v1 ; std::vector v2 ; std::vector v3 ; bool v1v2 = v1 == v2; // true bool v1v3 = v1 != v3; // true bool v2v3 = v2 == v3; // false
Удалить векторное содержимое и освободить память в C++
В этом посте мы обсудим, как удалить содержимое вектора и освободить память, выделенную вектором, для хранения объектов в C++.
1. Использование vector::clear функция
Мы можем использовать vector::clear функция для удаления всех элементов из вектора. Он работает, вызывая деструктор для каждого векторного объекта, но основное хранилище не освобождается. Итак, у нас остался vector нулевого размера, но с некоторой конечной емкостью.
std :: vector < int >v = < 1 , 2 , 3 , 4 , 5 >;
std :: cout << "The vector size is " << v . size ( ) << ", and its "
<< "capacity is " << v . capacity ( ) ;
результат:
The vector size is 0, and its capacity is 5
Начиная с C++11, мы можем вызывать vector::shrink_to_fit функционировать после clear() , что уменьшает способность вектора увеличивать размер. Он работает, “запрашивая” перераспределение вектора.
std :: vector < int >v = < 1 , 2 , 3 , 4 , 5 >;
v . shrink_to_fit ( ) ;
std :: cout << "The vector size is " << v . size ( ) << ", and its "
<< "capacity is " << v . capacity ( ) ;
результат:
The vector size is 0, and its capacity is 0
2. Использование vector::erase функция
Другим решением является вызов vector::erase функцию на векторе, как показано ниже. Это также страдает от той же проблемы, что и clear() функция, т. е. не гарантируется перераспределение памяти в векторе.
std :: vector < int >v = < 1 , 2 , 3 , 4 , 5 >;
v . erase ( v . begin ( ) , v . end ( ) ) ;
v . shrink_to_fit ( ) ;
std :: cout << "The vector size is " << v . size ( ) << ", and its "
<< "capacity is " << v . capacity ( ) ;
результат:
The vector size is 0, and its capacity is 0
3. Использование vector::resize функция
Мы также можем использовать vector::resize функция изменения размера вектора. Обратите внимание, что эта функция не уничтожает векторные объекты, и все ссылки на объекты остаются действительными.
std :: vector < int >v = < 1 , 2 , 3 , 4 , 5 >;
v . resize ( 0 ) ;
v . shrink_to_fit ( ) ;
std :: cout << "The vector size is " << v . size ( ) << ", and its "
<< "capacity is " << v . capacity ( ) ;
результат:
The vector size is 0, and its capacity is 0
4. Использование vector::swap функция
Все вышеперечисленные решения не могут освободить память, выделенную для векторного объекта, без вызова метода vector::shrink_to_fit функция. shrink_to_fit() уменьшает емкость, чтобы соответствовать размеру, но мы не можем полностью полагаться на это. Это связано с тем, что он делает необязательный запрос, и реализация вектора может полностью его игнорировать.
Существует еще один обходной путь для освобождения памяти, занятой векторным объектом. Идея состоит в том, чтобы заменить vector пустым вектором (без выделенной памяти). Это освободит память, занимаемую вектором, и всегда гарантированно будет работать.
Удалить элемент из vector и очистить память
При удалении элемента из вектора, хочу очистить занимаемую элементом Anchor память, но возникает Исключение.
Отслеживать
29.6k 3 3 золотых знака 17 17 серебряных знаков 36 36 бронзовых знаков
задан 17 мая 2022 в 6:43
1,925 11 11 серебряных знаков 21 21 бронзовый знак
С помощью оператора delete следует удалять только объекты, с динамическим временем хранения созданные с помощью оператора new . На строке delete &a; удаляется объект с автоматическим временем хранения, созданный на три строки выше в этой же функции.
17 мая 2022 в 6:49
Зачем изобретать велосипед? Вектор STL может и в конец добавлять и удалять определённые элементы.
17 мая 2022 в 7:24
@bloody, причем тут вектор? Распределитель вектора может освобождать память, которую выделял для элемента вектора, Получается, что элемент мы создали в одном участке памяти, а его вектор занес в другой.
17 мая 2022 в 9:40
Потеряна информация где был создан элемент изначала. С таким кодом уже ничего не сделаешь _ утечка памяти неизбежна, и надежда только на уборщика мусора. Память освобождать нужно в самих функциях_ после push_back
17 мая 2022 в 9:42
Если я в vector храню указатели на структуры, которые я создал через new. и потом хочу удалить элемент из вектора (указатель на структуру), то нужно ли мне очищать саму память занятую структурой? ведь из вектора просто пропадет указатель, а память не будет очищена. P.S. я переписал частично код и храню указатели vector Anchors;
17 мая 2022 в 9:54
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Вектор, как и все стандартные контейнеры, хранит копии того, что вы в него добавляете.
Anchor* a = new Anchor(addr); p->Anchors.push_back(*a);
в вектор попадает копия объекта, т.е. delete на ней вызывать не надо, это надо делать на оригинале, на a . Вы этого не делаете, поэтому здесь утечка памяти.
В этом же причина краша — вы зовете delete не на том объекте, который создали в куче, а на его копии, которую создал вектор.
Вообще, в современном C++ почти никогда не нужно использовать new и delete , если только вы не делаете свой аналог вектора или чего-то подобного.
Правильно добавлять элемент так: .emplace_back(addr); или .push_back(Anchor(addr)); (для вашего класса .push_back(addr); тоже сработает). При удалении delete не нужен, достаточно erase .
Link тоже нет смысла создавать через new . Просто Link l; . return l; . И еще, раз вы пишете на С++ а не на С, то вместо struct Link достаточно писать просто Link (везде кроме самого определения структуры).
Можно ли обнулить вектор?
Нужна помощь. В цикле идет считывание с клавиатуры в вектор, в каждой итерации необходимо заполнить вектор словами из строчки. Проблема в том, что он гад не обнуляется, и в итоге на второй итерации в векторе сидят все слова с 1-го ввода + все слова со второго ввода, а надо чтобы только со второго были, ну и т д Пытался обнулять элементы . Но КАК?
Вот
void null(std::vectorstd::string> &vec) { for(std::vectorstd::string>::iterator jx=vec.begin();jx!=vec.end();++jx){*jx="";}}
конечно не помогло, пытался так vec.end()=vec.begin(); , тоже ничего, как уменьшить его размер? он меня забадал уже.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Обнулить вектор
Здраствуйте, подскажите, пожалуйста, как можно обнулить вектор? Например, он объявлен у меня.

Можно ли в вектор добавить вектор?
не сложить, а добавить? например, даны такие векторы: std::vector<glm::vec2> myVector; и .
Можно ли обнулить биты с использованием XOR
Здравствуйте, есть двоичное 16 битное число, можно ли с помощью XOR обнулить 4, 7, 10 биты.

Как можно обнулить openFileDialog после использования
Как можно обнулить openFileDialog после использования
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
vec.clear()
![]()
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
Если надо, помимо всего прочего, почистить также и память, то делать так:
std::vector().swap(vec);
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
#include #include int main() { std::vectorint> vec(10, 0); std::cout size () <"\t" capacity () :: endl; // 10 10 - в векторе 10 элементов, памяти выделено под 10 элементов vec.clear(); // якобы очищаем вектор std::cout size () <"\t" capacity () :: endl; // 0 10 - в векторе 0 элементов, однако памяти выделено всё ещё под 10 элементов std::vectorint>().swap(vec); // создаём временный пустой вектор и меняем его содержимое с содержимым нашего // вектора; после этой строки временный вектор (в котором все данные из нашего // старого вектора) уничтожится, а старый вектор будет пуст (т.е. будет содержать // то, что содержал новенький с иголочки временный вектор без данных) std::cout size () <"\t" capacity () :: endl; // 0 10 - в векторе 0 элементов, памяти выделено под 0 элементов return 0; }