Как я могу проверить наличие элемента в std::vector в одной строке?
Другими словами, я ищу короткий и простой синтаксис для проверки существования элемента в векторе. И я не хочу вводить другую временную переменную для этого вектора. Спасибо!
Поделиться Источник 14 июля 2010 в 14:00
3 ответа
if (std::find(v.begin(), v.end(),value)!=v.end()) .
if (std::binary_search(v.begin(), v.end(), value) .
P.S. может потребоваться включить заголовок
Поделиться 14 июля 2010 в 14:04
int elem = 42; std::vector v; v.push_back(elem); if(std::find(v.begin(), v.end(), elem) != v.end()) < //elem exists in the vector >
Поделиться 14 июля 2010 в 14:02
vector::iterator it = std::find(v.begin(), v.end(), 123); if(it==v.end())
Поделиться 14 июля 2010 в 14:05
Поиск элемента в векторе
Нужна функция поиска элемента в векторе. Т.е., например, есть вектор с повторяющимися числами, если есть такое число в векторе, нужно вернуть истину. Может, в стандартной библиотеке есть готовое решение.
Отслеживать
31k 13 13 золотых знаков 96 96 серебряных знаков 157 157 бронзовых знаков
задан 22 окт 2014 в 6:51
10k 15 15 золотых знаков 53 53 серебряных знака 119 119 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вы не поверите, но такая функция есть! И она даже называется загадочно — find :).
Читать детальнее с примерами.
Отслеживать
ответ дан 22 окт 2014 в 7:11
112k 6 6 золотых знаков 93 93 серебряных знака 159 159 бронзовых знаков
перед чтения примеров хочу спросить. она возращает указатель на позицию вхождения или мусор. мне 0 или 1 надо
22 окт 2014 в 7:17
А вот вначале нужно почитать! Там написано, что если что то нашло — возвратит указатель (итератор) на найденное. Если нет — последний элемент (в случае с вектором это обычно myvector.end() . Но может быть Вам нужен std::cout.
22 окт 2014 в 7:23
Спасибо. Лучше я сам переберу. Но все равно спасибо. Учту ее на будующее, вдруг последний элемент искомое.
22 окт 2014 в 7:33
последний элемент не может быть «искомым». Потому что то, что в качестве параметра задается как последний элемент, это «за последним элементом» на самом деле. Поэтому все будет работать правильно. Ещё раз другими словами. vector.end() указывает на самый конец вектора, за последним элементом вектора. Разыминовать его нельзя. Можно почитать ещё на SO с картинками. А вот писать ручками — это дело такое. Можно легко натворить ошибок даже в током простом коде.
Как проверить наличие элемента в векторе c
Вектор — одномерный массив проиндексированных элементов. Вектор представляет собой пример наиболее полного стандартного контейнера. Для использования вектора стандартной библиотеки необходимо подключить файл с описанием вектора. При объявлении вектора (так же и других контейнеров) в треугольных скобках указывается тип данных элементов, хранящихся в векторе. Доступ к элементам вектора можно осуществлять через квадратные скобки, так же как и для обычных массивов.
Доступ к функциям вектора производится через оператор «.». Вектор – это особый тип данных, шаблон класса. Подробнее о классах и шаблонах см. главу 4 и раздел 5.4.
Для вектора не обязательно сразу указывать его размер, размер вектора можно изменить в любом месте программы при помощи функции resize(), а чтобы узнать размер вектора можно воспользоваться функцией size().
#include using namespace std; vectordouble> x; // создание вектора x.resize(10); // изменение размера вектора x.resize(x.size()+100); // изменение размера вектора double sum=0.0; for(int i=0; i//доступ по индексу >
Полный список функций вектора см. Приложение 5.
Рассмотрим более подробно пример работы с вектором. Обратите внимание, что в этом примере вектор передается в функцию по ссылке, т.к. классы и массивы большого объема нерационально копировать каждый раз при вызове функции, что происходит при передачи по значению. Если функция не должна изменить содержимое контейнера, дополнительно указывается ключевое слово const.
///////////////////////////////////////////////////////////////////////////// // Прикладное программирование // Пример 3.3. Пример работы с контейнером vector // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// #include // подключение библиотеки ввода-вывода #include // подключение описания вектора #include // для работы с таймером using namespace std; // подключение стандартного пространства имен для использования библиотек // прототипы функций int min(const vectordouble>& data); void fill_rand(vectordouble>& data, double max, double min); ///////////////////////////////////////////////////////////////////////////// // пример передачи вектора в функцию // функция находит индекс минимального числа в векторе int min(const vectordouble>& data) < int index=0; double min=data[0]; for(int i=1; iif(data[i]> return index; > ///////////////////////////////////////////////////////////////////////////// // Функция заполнения вектора случайными числами // data - вектор для заполнения // max - максимальное число случайного диапазона // min - минимальное число случайного диапазона void fill_rand(vectordouble>& data, double max, double min) < // устанавливает стартовую точку для генерации // случайных чисел по текущему времени srand((unsigned) clock()); for(int i=0; i > ///////////////////////////////////////////////////////////////////////////// void main() < vectordouble> x; // создание вектора // ввод количества элементов в векторе int n; cout"input vector size: "; cin>>n; // 1. заполнение контейнера индексами // заполнение контейнера for(int i=0; i// добавить элемент в конец контейнера x.push_back(i); > // вывод всех элементов контейнера cout< for(int i=0; i ; //доступ по индексу > // 2. заполнение контейнера случайными числами от 1 до 100 // очистить контейнер x.clear(); // изменить размер x.resize(20); // заполнить случайными числами fill_rand(x, 1, 100); // вывод всех элементов контейнера cout< for(int i=0; i//доступ по индексу > // вывод минимального числа в контейнере cout< // x[min(x)] аналогично записи int i=min(x); x[i]; > ///////////////////////////////////////////////////////////////////////////////
При работе с вектором мы сталкиваемся с такими понятиями как размер и емкость. Размер — количество элементов, хранимых в контейнере, можно узнать с помощью функции size(), а изменить с помощью resize(). Операции push_back(), insert(), erase() также изменяют размеры вектора. Когда размеры вектора изменяются, то все его элементы могут быть перемещены в новую область памяти, поэтому хранить указатели на элементы вектора не имеет смысла и может быть опасно. Всегда нужно работать через итераторы (см.раздел 3.5).
С помощью функции empty() можно узнать о наличии элементов в контейнере. Если контейнер действительно пуст, то функция возвращает true.
bool res=x.empty(); // эквивалентно x.size() == 0
При работе с вектором можно выделить (зарезервировать) некоторую область памяти для потенциального расширения. Использование функции reserve() обеспечить выделение памяти для новых элементов контейнера. При этом вставка новых элементов или изменение размеров с помощью resize() не потребует перераспределения хранимого вектора в памяти. Определить «емкость» вектора можно с помощью функции capaсity().
Контейнер 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 B , A >= B ).
Создание многомерных векторов
Элементами вектора могут быть и другие вектора. Например, можно сделать вектор, каждый элемент которого представляет собой вектор целых чисел:
Тем самым, a[i] будет вектором целых чисел, а обращаться к j-му элементу вектора a[i] можно через a[i][j].
Чтобы создать двумерный вектор размером n×m можно внешний вектор объявить размером n, а затем в цикле изменить размер каждого вложенного вектора:
for (int i = 0; i < n; ++i)
a[i].resize(m);
Но можно сделать это и в одну строку, если передать вторым параметром для конструктора вектора конструктор, который создает вектор целых чисел длины m:
Заметим, что размеры вложенных векторов могут изменяться и быть различными.
Также можно создавать вектор из стеков, очередей, деков, можно создавать трехмерные векторы и т.д.