третий параметр алгоритма find
Используя метод find, легко найти есть ли заданное значение в контейнере, или нет:
std::vector vec; std::vector::iterator itr = find(vec.begin() ,vec.end(), int val); if(. )
и так далее; Но что, если вектор содержит какие-либо структуры, объекты, или даже указатели на них? Возможно ли использовать эту функцию для нахождения необходимого значения, если оно является полем класса, а вектор состоит из указателей на объект этого класса? Что-то вроде:
class ClassName < public: int x; std::string y; >; std::string foo = "bar"; std::vector vec1; std::vector::iterator itr = find( vec1.begin(), vec1.end(), . )
Что нужно написать вместо знаков вопроса, чтобы найти такой указатель, который указывает на объект, поле std::string y которого равно строке foo ? Если это невозможно с алгоритмом find, то какие альтернативы?
Функция find
Доброго дня. Самостоятельно изучаю С++. При изучении функций типа string столкнулся с проблемой. Я беру из файла строку определенного вида. Насколько я понял, функция find возвращает значение типа int — позицию первого вхождения данной подстроки. Мне необходимо выводить на экран определенные строки. пытаюсь делать
if (Line.find(". ") != -1)
, но он в упор отказывается выводить нужные строки. Подскажите, пожалуйста, в чем может быть проблема? Вот полный код:
1 2 3 4 5 6 7 8 9 10 11
string Line; ifstream stream("C:\\data.txt"); getline(stream, Line); while (getline(stream, Line)) if (Line.find("2.Moscow") != -1 && Line.find("4.St.P") != -1 && (Line.find("3.07") != -1 || Line.find("3.08") != -1 || Line.find("3.09:00") != -1)) cout Line endl; stream.close(); return 0;
Вот строки:
1.1488 2.Moscow 3.12:00 4.Voronezh 5.15:00 6.3:00 7.100
1.228 2.Moscow 3.12:00 4.St.P 5.15:00 6.3:00 7.100
1.1337 2.Vladivostok 3.20:00 4.Istra 5.15:00 6.3:00 7.100
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Функция find
Почему не работает функция find?? Дело в библиотеке??Я смотрел проекты там она была написана с.
Функция find
Что значит строчка: if(s.find(str,0) != -1)
Функция find
Почему #include <iostream> #include <iterator> #include <string> #include <algorithm> using.
Как работает функция std::string::find(. )
здравствуйте есть допустим вот такой код #include <iostream> #include <string> using namespace.
1704 / 1104 / 337
Регистрация: 25.01.2019
Сообщений: 2,907
Сообщение от 4burek
(Line.find(» 3.07 «) != -1 || Line.find(» 3.08 «) != -1 || Line.find(» 3.09:00 «)
Сообщение от 4burek
Я этого тоже не вижу в твоих строчках
Сообщение от 4burek
1.1488 2.Moscow 3.12:00 4.Voronezh 5.15:00 6.3:00 7.100
1.228 2.Moscow 3.12:00 4.St.P 5.15:00 6.3:00 7.100
1.1337 2.Vladivostok 3.20:00 4.Istra 5.15:00 6.3:00 7.100
Регистрация: 26.04.2020
Сообщений: 14
Спасибо большое. Думал что ошибка в коде, а на данные совсем забыл посмотреть
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как использовать функции string::find или функция strstr(str1 ,str2)
как использовать функции string::find или функция strstr(str1 ,str2) Добавлено через 3 минуты.
Как минимально просто использовать функция std::find с последовательность типа : list
Добрый день. Как минимально просто использовать функция std::find с последовательность типа .
Почему map.find не доработают для std::find
Добрый вечер, вопрос философский о разработчиках стандарта и последующих имплементациях.
Функция find принимает вектор и число, которое ищется и возвращает указатель на найденное число
здравствуйте. подскажите есть вот такая задача //Написать ф-цию find, которая принимает вектор и.
отсутствуют экземпляры перегруженная функция «find»
Здравствуйте, нужна помощь с кодом. В 5 строке снизу с функцией find ошибка отсутствуют экземпляры.
Функция find в C++: поиск элемента
Дорогие читатели, рад вас видеть! В этой статье разберем, как работает функция find из файла algorithm .
Как использовать find
Функция find принимает 3 параметра:
- указатель на начало массива
- указатель на конец массива
- значение, которое нужно найти
Функция find будет последовательно идти по массиву с начала до конца, пока не найдет элемент, который равен значению для поиска. Если значение не будет найдено, то find вернет указатель на конец массива. Вот пример использования данной функции:
#include #include using namespace std; int main() int arr[3] = 1, 2, 3>; auto pointer = find(arr, arr + 3, 2); if (pointer == end(arr)) cout <"элемент не найден" ; > else cout <"позиция: " - begin(arr) <" значение: " <*pointer ; > return 0; >
Результат выполнения программы:
позиция: 1 значение: 2
find можно применять не ко всему массиву, а только к его части. В этом случае нужно просто передать указатели на интересующую часть массива. Важно помнить, что при поиске указатель на конец массива не учитывается.
Как реализовать find самому
Для того чтобы лучше понять как работает find , давайте реализуем свою версию этой функции для массива чисел:
#include using namespace std; int* find(int* start, int* end, int value) while (start != end) if (*start == value) return start; start++; > return end; > int main() int arr[3] = 1, 2, 3>; auto pointer = find(arr, arr + 3, 2); cout <"позиция: " - arr <", значение: " <*pointer ; return 0; >
Вывод данной программы:
позиция: 1, значение: 2
Давайте разберемся что функция find делает:
- Мы запускаем цикл while до тех пор, пока указатель start не равен указателю end .
- Если значение, на которое указывает start равно значению, которое мы ищем, то можно радоваться, мы нашли то что искали.
- Иначе двинемся дальше увеличивая указатель.
- Если мы так и не нашли value , то возвращаем end .
Поскольку с указателями можно производить арифметические операции, мы можем получить позицию искомого значения, просто вычтя start из найденного указателя: pointer — arr .
Поздравляю! Вы реализовали свою версию функции find , аналогичной той, что предоставляется в стандартной библиотеке C++.
Как использовать find с vector, set и другими контейнерами
Так как find проходит массив линейно, анализируя каждый элемент, мы можем использовать итераторы для обхода любого контейнера в C++. Давайте посмотрим, как использовать find с vector :
#include #include #include using namespace std; int main() vectorint> vec 1, 2, 3>; auto it = find(vec.begin(), vec.end(), 2); cout <"позиция: " - vec.begin() <" значение: " <*it ; return 0; >
Вывод данной программы:
позиция: 1 значение: 2
Вывод программы снова не поменялся, однако мы теперь используем .begin() и .end() для того, чтобы указать границы поиска для find .
Поскольку все контейнеры позволяют нам использовать итераторы, мы можем применять find не только к векторам, но и к спискам, множествам и т.д. Вот пример с множествами:
setint> s 1, 2, 3>; auto it = find(s.begin(), s.end(), 2); cout <"значение: " <*it ;
Стоит отметить, что мы не можем определить позицию найденного элемента в set , так как множества не гарантируют порядок хранения элементов.
Вывод данной программы:
значение: 2
Таким образом, функция find совместима с различными контейнерами в C++.
Пример программы с использованием find
Для того, чтобы закрепить изученный материал, давайте напишем простую программу. Программа будет спрашивать нас, что мы хотим сделать. У нас будет 4 варианта:
- Показать все числа, которые сейчас находятся в массиве.
- Добавить число в конец массива.
- Найти число в массиве.
- Выйти из программы.
Для поиска мы будем использовать функцию find :
#include #include using namespace std; // Отображение списка чисел void displayList(const int numbers[], const int& size) cout <"Текущие числа в списке: "; for (int i = 0; i size; i++) cout [ i] <" "; > cout ; > int main() const int MAX_SIZE = 100; int numbers[MAX_SIZE] = 1, 2, 3, 4, 5>; int currentSize = 5; while (true) // Отображение меню для пользователя cout <"\nМеню:\n"; cout <"1. Показать числа\n"; cout <"2. Добавить число\n"; cout <"3. Найти число\n"; cout <"4. Выйти\n"; cout <"Введите ваш выбор: "; int choice; cin >> choice; switch (choice) case 1: displayList(numbers, currentSize); break; case 2: if (currentSize MAX_SIZE) int newNum; cout <"Введите число для добавления: "; cin >> newNum; numbers[currentSize] = newNum; currentSize++; cout <"Число добавлено.\n"; > else cout <"Список полон.\n"; > > break; case 3: displayList(numbers, currentSize); int num; cout <"Введите число для поиска: "; cin >> num; int* result = find(numbers, numbers + currentSize, num); if (result != numbers + currentSize) cout <"Число " <" найдено в списке!" ; > else cout <"Число " <" не найдено в списке." ; > > break; case 4: cout <"До свидания!\n"; return 0; default: cout <"Неверный выбор. Пожалуйста, выберите снова.\n"; break; > > return 0; >
Теперь давайте запустим данную программу:
Меню: 1. Показать числа 2. Добавить число 3. Найти число 4. Выйти Введите ваш выбор: 1 Текущие числа в списке: 1 2 3 4 5 Меню: 1. Показать числа 2. Добавить число 3. Найти число 4. Выйти Введите ваш выбор: 3 Текущие числа в списке: 1 2 3 4 5 Введите число для поиска: 8 Число 8 не найдено в списке. Меню: 1. Показать числа 2. Добавить число 3. Найти число 4. Выйти Введите ваш выбор: 2 Введите число для добавления: 8 Число добавлено. Меню: 1. Показать числа 2. Добавить число 3. Найти число 4. Выйти Введите ваш выбор: 3 Текущие числа в списке: 1 2 3 4 5 8 Введите число для поиска: 8 Число 8 найдено в списке! Меню: 1. Показать числа 2. Добавить число 3. Найти число 4. Выйти Введите ваш выбор: 4 До свидания!
- Реализация find для строки:
Напишите программу, где вы реализуете функцию find , похожую на ту, что описана в статье, но для работы со строками (тип std::string ). Ваша функция должна искать заданный символ в строке и возвращать итератор к этому символу. Если символ не найден, возвращайте итератор к концу строки. - Использование find с разными контейнерами:
Напишите программу, которая демонстрирует использование встроенной функции find с различными контейнерами C++ (например, std::list , std::deque ). Для каждого контейнера выводите позицию найденного элемента и его значение. - Сравнение производительности:
Реализуйте две версии функции find : одну, которую вы написали сами, и другую из стандартной библиотеки C++. Сравните их производительность на больших массивах данных (например, миллион элементов) и опишите разницу во времени выполнения.
Если у вас остались вопросы или есть замечания, оставьте комментарий ниже.
Читайте также
В этом уроке вы познакомитесь с функцией log в C++. Данная функция позволяет нам получить натуральный логарифм числа. Мы разберемся с тем как работает функция log в теории и закрепим изученное на практике.
Функция ceil используется в языках C и C++ для округления числа вверх. В статье будут разобраны примеры использования этой функции. Также в конце статьи есть упражнения.
Set и multiset в C++
В данном уроке вы познакомитесь с двумя контейнерами C++, которые очень важны — set и multiset. По другому их еще называют множеством и мультимножеством. Они автоматически сортируются при добавлении нового элемента. Но у каждого из них есть своя особенность, которую мы разбираем в этой статье.
В данном уроке вы узнаете: что такое map, как правильно его использовать, какими функциями можно оперировать, а также стоит ли его использовать у себя в проектах.
vector::push_back в C++
Язык C++ предоставляет различные способы работы с данными. Функция push_back — это популярный метод добавления элементов в вектор. В этой статье мы подробно рассмотрим эту функцию, разберемся, как и когда её использовать, и обсудим некоторые интересные моменты, связанные с ней.
Функция rand в C++
Язык C++ имеет несколько способов генерации случайных чисел. Функция rand — один из самых популярных способов получить случайное число. В этой статье мы научимся использовать эту функцию, генерировать случайные числа в диапазоне, а также реализуем свой простенький генератор случайных чисел.
Функция exp используется в языках C и C++ для вычисления экспоненты. В статье будут разобраны примеры использования этой функции. Также в конце статьи есть упражнения.
string::substr в C++
C++ предлагает различные методы работы со строками. Одной из таких функций является substr, которая позволяет извлекать определенные части строки. В этой статье мы рассмотрим функцию substr, узнаем, как она работает, и посмотрим на ее многочисленные применения.
Функция sqrt используется в языках C и C++ для вычисления квадратного корня числа. В статье будут разобраны примеры использования этой функции. Также в конце статьи есть упражнения.
printf в C/C++
Функция printf — это швейцарский нож для вывода на консоль в C/C++. Из-за этого эта функция поддерживает огромное количество разных флагов и модификаторов для стилизации вывода как вам угодно. В этой статье мы разберемся на примерах, как же ей, все-таки, пользоваться.
snprintf в C/C++
Функция snprintf используется в языках C и C++ для форматирования строки без вывода ее на экран. В статье будут разобраны примеры использования этой функции. Также в конце статьи есть упражнения.
Функция sort и компаратор в C++
Что такое сортировка, как ею управлять — все ответы находятся в этой статье. Вот что вы узнаете после прочтения данной статьи: что такое компаратор, как использовать стандартную сортировку, как сортировка работает для вектора или списка.
Векторы в C++
В этом уроке вы узнаете, что такое вектор в C++, а также если вы хотите узнать, как правильно пользоваться и какие функции к им применять — то вам сюда.
Функция copy в C++
В этом уроке вы узнаете что такое функция copy, как ее использовать. А также узнаете с какими контейнерами она работает.
Стек (stack) в C++
В этой статье вы познакомитесь с структурой данных стек. Мы разберем что это за зверь и как им пользоваться в своей программе. Также мы изучим стек через массив.
string::npos в C++
Разбираем std::string::npos в C++: что это такое, как использовать с методами std::string, а также практический пример использования этой константы.
Функция fabs в C++
В данной статье мы разберемся как работает функция fabs в C++. Также мы узнаем в чем отличие fabs от abs и реализуем свою версию данной функции.
В данном уроке пойдет речь о функции pow в C++. Мы рассмотрим с примерами, как возвести число в степень, а также какие есть альтернативы у данной функции.
string::size в C++
C++ предлагает разнообразные инструменты для работы со строками, и одна из самых важных функций — это string::size. В этой статье мы подробно рассмотрим эту функцию, поймем, как она измеряет строки, и исследуем ее практическое применение.
vector::erase в C++
C++ предлагает несколько способов управления элементами в контейнерах. Функция erase — это популярный способ удаления элементов из вектора. В этой статье мы подробно рассмотрим эту функцию, разберем ее особенности и покажем практические примеры ее использования.
vector::size в C++
В C++, контейнер std::vector представляет собой динамический массив, который может автоматически изм