Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
#1

STL. Алгоритм find(). Игнорировать регистр - C++

19.04.2013, 14:55. Просмотров 983. Ответов 7
Метки нет (Все метки)

Вся суть вопроса изложена в теме. Есть код, я помещаю в очередь с двусторонним доступом 9 слов, далее использую алгоритм find чтобы найти введенное пользователем слово, но он рассматривает "Alex" и "alex" как разные слова. Как можно заставить алгоритм игнорировать регистр?
C++
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//---------------------------------------------------------------------------
 
#include <iostream>
#include <iterator>
#include <deque>
#include <string>
using namespace std;
 
//---------------------------------------------------------------------------
 
 
int main(int argc, char* argv[])
{
 deque<string> names;
 deque<string> :: iterator iter;
 string SearchName;
 names.push_back("Alex");
 names.push_back("Robert");
 names.push_back("Maximus");
 names.push_back("Darius");
 names.push_back("Zyra");
 names.push_back("Morgana");
 names.push_back("Teemo");
 names.push_back("Ryze");
 names.push_back("Prophet");
 
 
 cout << "\n Enter search name: ";
 cin >> SearchName;
 
 iter =
 find_if(names.begin(),names.end(),bind2nd(equal_to<string>(),SearchName));
 int position = iter - names.begin();
 
 if( iter != names.end() )
 cout << "\n Foud name " << SearchName << " in position: " << position << endl;
 else
 cout << "Name wasn't found." << endl;
 system("PAUSE");
        return 0;
}
//---------------------------------------------------------------------------
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 14:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос STL. Алгоритм find(). Игнорировать регистр (C++):

STL алгоритм find, найти элементы - C++
Здраствуйте! У меня есть например массив vector&lt;int&gt; mas = {1,2,3,4,4,4,5,6}; Найти надо элемент 4, но find ищет только первый этот...

STL find - C++
deleted нашел

оператор find в stl - C++
Допустим у меня есть такой код: #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include &lt;windows.h&gt; #include &lt;iostream&gt;...

Организовать find в векторе через STL!!! - C++
Написал через вектор STL некий контейнер заполнил его данными. Написал сортировку и вывод всех значений через вспомогательные обьекты....

Поиск в строке find, регистр букв - C++
Здраствуйте! Подскажите пожалуйста как мне тут с помощь метода find найти все искомые слова. Тут 3 слова Hello, надо их все найти и...

Find() для поиска элемента в поле класса / STL - C++
Есть какой то класс, к примеру: class Dog { public: Dog () {}; public: string Name; string Poroda; string Pol;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.04.2013, 14:59 #2
fuzzytoozy, Написать свой компаратор определенно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::string to_lower_copy(std::string upper)
{
   std::transform(upper.begin(), upper.end(), upper.begin(), tolower);
}
 
bool CompareIgnoringCase(const std::string& current, const std::string& to_find)
{
   return to_lower_copy(current) == to_lower_copy(to_find);
}
 
int main()
{
  // fill vector etc.
  find_if(names.begin(), names.end(), bind2nd(ptr_fun(CompareIgnoringCase), SearchName));
}
А можно и оптимизировать слегка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::string to_lower_copy(std::string upper)
{
   std::transform(upper.begin(), upper.end(), upper.begin(), tolower);
}
 
struct CompareIgnoringCase : public std::unary_function<std::string, bool>
{
public:
   CompareIgnoringCase(const std::string& s) : to_find(to_lower_copy(s)) {}
   result_type operator () (const argument_type& s)
   {
      return to_lower_copy(s) == to_find;
   }
private:
   std::string to_find;
};
 
find_if(v.begin(), v.end(), CompareIgnoringCase(SearchName));
1
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
19.04.2013, 15:18  [ТС] #3
Спасибо, единственно не понял: unary_function<std::string, bool>, а что значит вот это собственно?
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.04.2013, 15:19 #4
Или лямбдой небольшой:
C++
1
2
3
4
5
6
7
8
9
10
find_if(names.begin(),names.end(), [SearchName](const std::string& s)->bool
 {
     if (s.size() != SearchName.size()) return false;
     std::string comp = SearchName;
     for (unsigned i = 0; i<s.size(); ++i)
     {
         if (toupper(s[i]) != toupper(comp[i])) return false;
     }
     return true;
 });
0
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
19.04.2013, 15:26  [ТС] #5
CompareIgnoringCase(const std::string& s) : to_find(to_lower_copy(s)) что делает это выражение? что значит : между функцией и строкой ? Это конструктор структуры?
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.04.2013, 15:37 #6
fuzzytoozy, это адаптируемый функтор. Вот почитайте: http://programming-lang.com/ru/comp_...ers/1/j96.html
1
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
19.04.2013, 15:44  [ТС] #7
спасибки. Еще такой вопросик, в перегруженном операторе () аргумент этой функции это есть значение из контейнера для алгоритма find? так ведь?

C++
1
2
3
4
result_type operator()( const argument_type& s )
        {
         return low_copy(s) == to_find;
        }
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.04.2013, 16:11 #8
fuzzytoozy, Угу. argument_type это typedef в unary_function.

Добавлено через 1 минуту
Цитата Сообщение от fuzzytoozy Посмотреть сообщение
CompareIgnoringCase(const std::string& s) : to_find(to_lower_copy(s)) что делает это выражение?
Это список инициализации. Инициализируется поле to_find результатом to_lower_copy.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 16:11
Привет! Вот еще темы с ответами:

Алгоритм STL - C++
Помогите определиться с предикатом в алгоритме p_sort=find_if(v_sort.begin(),v_sort.end(),???) в случае, если вектор хранит...

STL. Алгоритм copy() - C++
Здравствуйте. Решаю задачку из учебника лафоре. Звучит она следующим образом: Алгоритм copy() можно использовать для копирования...

Std::move stl-алгоритм - C++
здравствуйте, есть такой код: std::string his = &quot;what the work ?&quot;; std::istringstream isg(his); ...

Алгоритм замещения страниц LRU с помощью методов библиотеки STL - C++
Здравствуйте! Мне нужно реализовать алгоритм замещения страниц LRU с помощью методов библиотеки STL. Подскажите пожалуйста, как это сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.04.2013, 16:11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru