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

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

Восстановить пароль Регистрация
 
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
19.04.2013, 14:55     STL. Алгоритм find(). Игнорировать регистр #1
Вся суть вопроса изложена в теме. Есть код, я помещаю в очередь с двусторонним доступом 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;
}
//---------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 14:55     STL. Алгоритм find(). Игнорировать регистр
Посмотрите здесь:

оператор find в stl C++
Организовать find в векторе через STL!!! C++
STL find C++
C++ STL алгоритм find, найти элементы
Поиск в строке find, регистр букв C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.04.2013, 14:59     STL. Алгоритм find(). Игнорировать регистр #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));
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
19.04.2013, 15:18  [ТС]     STL. Алгоритм find(). Игнорировать регистр #3
Спасибо, единственно не понял: unary_function<std::string, bool>, а что значит вот это собственно?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.04.2013, 15:19     STL. Алгоритм find(). Игнорировать регистр #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;
 });
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
19.04.2013, 15:26  [ТС]     STL. Алгоритм find(). Игнорировать регистр #5
CompareIgnoringCase(const std::string& s) : to_find(to_lower_copy(s)) что делает это выражение? что значит : между функцией и строкой ? Это конструктор структуры?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
19.04.2013, 15:37     STL. Алгоритм find(). Игнорировать регистр #6
fuzzytoozy, это адаптируемый функтор. Вот почитайте: http://programming-lang.com/ru/comp_...ers/1/j96.html
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
19.04.2013, 15:44  [ТС]     STL. Алгоритм find(). Игнорировать регистр #7
спасибки. Еще такой вопросик, в перегруженном операторе () аргумент этой функции это есть значение из контейнера для алгоритма find? так ведь?

C++
1
2
3
4
result_type operator()( const argument_type& s )
        {
         return low_copy(s) == to_find;
        }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 16:11     STL. Алгоритм find(). Игнорировать регистр
Еще ссылки по теме:

Алгоритм STL C++
STL.Find() C++
C++ Find() для поиска элемента в поле класса / STL

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.04.2013, 16:11     STL. Алгоритм find(). Игнорировать регистр #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.
Yandex
Объявления
19.04.2013, 16:11     STL. Алгоритм find(). Игнорировать регистр
Ответ Создать тему
Опции темы

Текущее время: 05:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru