Как проверить что вектор пустой c
Перейти к содержимому

Как проверить что вектор пустой c

  • автор:

Как инициализировать пустой глобальный вектор в C ++

«nn» будет выдаваться клиентом при запуске программы. Итак, мой вопрос в том, как я могу инициализировать пустой вектор? Любые идеи приветствуются!

Обратите внимание, если я вызываю другую функцию, которая по определению возвращает вектор как возвращаемое значение, я могу написать

vector2= OneClass.OneMethod(SomeInputVector); 

где OneClass является объектом класса, а OneMethod — это метод в классе OneClass.

Обратите также внимание, когда я удаляю комментарий/**/перед вектором, он больше не глобальен и бросает мне ошибку при попытке получить доступ к коэффициентам.

Заполнение векторов. C++

reserve ничего не меняет, потому что в векторе все еще будет 0 элементов. resize сделал бы так, что цикл выполнялся, но остается другая проблема: insert «инвалидирует» итератора i (после чего им нельзя пользоваться), это раз. А два — даже если это проигнориовать, получается бесконечный цикл.

7 янв 2021 в 15:50
А сколько вы хотите внести в вектор значений, можно узнать?
7 янв 2021 в 16:27

Пожалуйста выберите один из двух предоставленных ответов, как «Правильный ответ», если конечно он таковым является :). Для этого нужно нажать на галочку слева от понравившегося вам ответа.

7 янв 2021 в 22:28

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Если вы хотите заполнить вектор при помощи итератора, то нужно воспользоваться операцией разыменования итератора.

int main() < int n = 3; //Размер вектора int size_vector = 3; //Выделим сразу память под size_vector элементов vectorvec2(size_vector); //Пройдемся по всему вектору for (vector::iterator i = vec2.begin(); i != vec2.end(); i++) < //Операция разыменования позволяет изменить значение //элементу на который указывает итератор *i = n; n++; >return 0; > 

Так же вектор можно заполнить при помощи функции insert или push_back , но эти функции не меняют значения, а добавляют новые значения.

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

int main() < int n = 3; int size_vector = 3; vectorvec2; vector::iterator i = vec2.end(); for (int j = 0; j < size_vector; ++j) < vec2.insert(i, n); n++; i = vec2.end(); >return 0; > 

Но последний пример он больше для того, чтобы показать итератор, на самом деле проще убрать полностью переменную i и писать вот такую строчку:

vec2.insert(vec2.end(), temp); 

Отслеживать
ответ дан 7 янв 2021 в 15:49
Павел Ериков stand with Russia Павел Ериков stand with Russia
5,635 1 1 золотой знак 12 12 серебряных знаков 32 32 бронзовых знака

Хоть это странно выглядит заполнять так как у вас и также неверно, но я могу предложить минимальный набор правок, без .insert(. ) , чтобы похожий на ваш код заработал, тоже с итераторами (для примера заполняю 25 элементов в векторе):

#include #include using namespace std; int main() < int n = 3; vectorvec2(25); for (vector::iterator i = vec2.begin(); i != vec2.end(); ++i) *i = n++; for (auto x: vec2) cout
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 

Либо вариант заполнения с .insert(. ) ниже:

#include #include using namespace std; int main() < int n = 3; vectorvec2; for (int j = 0; j
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 

Отслеживать
ответ дан 7 янв 2021 в 16:07
3,032 8 8 серебряных знаков 19 19 бронзовых знаков
Извините, а чем ваш код отличается от моего?
7 янв 2021 в 16:25

@ПавелЕриков Когда я его написал то вашего ответа ещё не было, когда нажал послать готовый ответ то одновременно система сообщила что в это время ваш ответ появился, в итоге я не удалял свой т.к. написал уже, ну чей выберут тот выберут.

7 янв 2021 в 16:40

Я увидел ваш ответ и подумал, что одновременно нажали. Но как то изменять ответ добавляя идею из моего ответа, как то не красиво уже. Ну ладно дело ваше.

7 янв 2021 в 16:44

@ПавелЕриков Я всегда любые ответы дополняю поэтапно, т.е. минимальную базу пишу вначале, постю, а потом все остальные идеи что в голове были дополняю. Вариант с .insert(. ) у меня в голове конечно был, т.к. это супер очевидное решение. Как говорю я запостил минимальное решение и начал писать остальные, точнее одно с инсертом. Просто очевидное insert-базированное решение не может быть чьей то исключительной идеей, которое нужно где то почитать и скопировать, оно всем понятно, и у меня в голове оно тоже было. Просто раз я пост уже написал то решил его всеми идеями из головы дополнить.

Как проверить что вектор пустой 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

как правильно релалзовать фунцию которая будет проверять пустой ли обьекто класса вектор?
дума надо его чрез були делать но как?

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Пустой вектор
У меня есть структура Card, в которой хранятся 2 переменные типа char — достоинство и масть карты .

Функция видит пустой вектор, хотя он заполнен
В начале программы объявляю вектор, в функции main инициализирую, заполняю его с использованием.

Проверка, является ли текст палиндромом: вывод true в случае пустой строки
Помогите пожалуйста разобраться. прохожу курс и там задание по поиску палиндромов. Суть задачи.

Предусмотреть применение конструкторов: по умолчанию создающий пустой вектор
Как мне с переменной d помступить ,чтоб на экран все же вывелось?Ошибки выходят. namespace Vekt.

Векторы в C++ — урок 12

Вектор в C++ — это замена стандартному динамическому массиву, память для которого выделяется вручную, с помощью оператора new .

Разработчики языка рекомендуют в использовать именно vector вместо ручного выделения памяти для массива. Это позволяет избежать утечек памяти и облегчает работу программисту.

  • Пример создания вектора
  • Управление элементами вектора
  • Методы класса vector

Пример создания вектора

#include int main() < // Вектор из 10 элементов типа int std::vectorv1(10); // Вектор из элементов типа float // С неопределенным размером std::vector v2; // Вектор, состоящий из 10 элементов типа int // По умолчанию все элементы заполняются нулями std::vector v3(10, 0); return 0; > 

Управление элементами вектора

Создадим вектор, в котором будет содержаться произвольное количество фамилий студентов.

#include #include int main() < // Поддержка кириллицы в консоли Windows setlocale(LC_ALL, ""); // Создание вектора из строк std::vectorstudents; // Буфер для ввода фамилии студента std::string buffer = ""; std::cout 0) < // Добавление элемента в конец вектора students.push_back(buffer); >> while (buffer != ""); // Сохраняем количество элементов вектора unsigned int vector_size = students.size(); // Вывод заполненного вектора на экран std::cout return 0; > 

Результат работы программы:

Методы класса vector

Для добавления нового элемента в конец вектора используется метод push_back() . Количество элементов определяется методом size() . Для доступа к элементам вектора можно использовать квадратные скобки [] , также, как и для обычных массивов.

  • pop_back() — удалить последний элемент
  • clear() — удалить все элементы вектора
  • empty() — проверить вектор на пустоту

Подробное описание всех методов std::vector (на английском) есть на C++ Reference.

Контейнер vector

Вектор в STL — это аналог массива, контейнер, который позволяет осуществлять доступ к элементам по индексам. Вектор является шаблоном, и объявляется, как все остальные шаблоны.

Например, вектор целых чисел можно объявить так:

При таком создании вектор является «пустым», не содержащим элементов. Можно сразу же объявить вектор некоторого фиксированного размера, если задать конструктор, указав в конструкторе количество элементов вектора:

В этом случае значения элементов вектора будут нулевыми (а если элементами вектора являются не числа, а, например, строки или другие структуры данных, то элементы вектора будут принимать значения по умолчанию, то есть строки и вложенные вектора будут пустыми). При необходимости можно сразу же заполнить вектор некоторыми (одинаковыми), значениями, указав их в качестве второго параметра конструктора, например, для заполнения вектора значениями -1 можно его объявить так:

Для использования контейнера vector необходимо подключить заголовочный файл vector:

Обращение к элементам вектора

К элементам вектора можно обращаться по индексу, например, так: A[i] .

Есть и другой способ обращения к элементу вектора с индексом i: использование метода at: A.at(i) . Отличие метода at от обращения при помощи квадратных скобок в том, что при использовании метода at происходит проверка правильности индекса, и в случае выхода за границы вектора происходит ошибка исполнения. Это полезно при отладке программ.

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

Следует отметить, что работа с элементами вектора осуществляется медленнее, чем с элементами массива (даже при использовании квадратных скобок, то есть без проверки выхода за границы массива).

Помимо этого у вектора есть метод front(), возвращающий ссылку на первый элемент и метод back(), возвращающий ссылку на последний элемент вектора.

Изменение размера вектора

Размер вектора можно узнать при помощи универсального метода size(), возвращающего для всех контейнеров в STL их размер. Также есть метод empty(), возвращающий логическое значение (true, если вектор пустой).

Размер вектора можно изменить в любой момент, при помощи метода resize. У этого метода может быть один или два параметра. Вызов метода resize(n) изменяет размер вектора до n элементов (длина вектора может как уменьшится, так и увеличиться). Вызов метода resize(n, val) изменяет размер вектора до n элементов, и если при этом размер вектора увеличивается, то новые элементы получают значение, равное val.

Очень часто бывает полезно добавлять элементы в конец вектора по одному и удалять элементы из конца вектора по одному. Для добавления нового элемента, равного val, в конец вектора, используется метод push_back(val). Для удаления последнего элемента вектора используется метод pop_back() — он не возвращает значения.

Добавление элемента в конец вектора осуществляется в среднем за O(1). Это реализовано за счет того, что память для хранения элементов вектора выделяется «с запасом», то есть можно будет добавлять элементы по одному, пока не кончится запас памяти. Если запас памяти исчерпан, выделяется новая память, при этом «запас» размера вектора удваивается.

Очистить вектор можно при помощи метода clear().

Вставка и удаление элементов в середину вектора

Метод erase позволяет удалять из середины вектора один или несколько элементов. Этот метод работает с итераторами. Подробней про его использование можно прочитать в документации.

Метод insert позволяет вставлять в середину вектора новый элемент, или несколько равных элементов, или другой вектор, или фрагмент другого вектора. Этот метод также работает с итераторами и про его использование можно прочитать в документации.

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

Присваивание и сравнение векторов

Содержимое одного вектора можно целиком скопировать в другой вектор при помощи операции присваивания: A = B .

Также вектора можно сравнивать на равенство и неравенство ( A == B , A != B ), и сравнивать их содержимое в лексикографическом порядке ( A = B ).

Создание многомерных векторов

Элементами вектора могут быть и другие вектора. Например, можно сделать вектор, каждый элемент которого представляет собой вектор целых чисел:

Тем самым, a[i] будет вектором целых чисел, а обращаться к j-му элементу вектора a[i] можно через a[i][j].

Чтобы создать двумерный вектор размером n×m можно внешний вектор объявить размером n, а затем в цикле изменить размер каждого вложенного вектора:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *